j2me 手机定位(GPS,基站)

转载请注明出处:http://blog.csdn.net/nairuohe/archive/2010/09/21/5899000.aspx

开发J2me 应用程序时,如果需要获取到你的手机用户身处何处,据我所知,有两种方法。

    第一、   通过GPS全球定位系统获取

    第二、   使用基站定位方法

下面较详细的介绍这两种方法。

    先说GPS定位法。现在全球有24GPS卫星在离地面1万多公里的高空上环绕地球运行,地面上的任意一点都可以同时观测到4颗以上的卫星。手机里的GPS信号接收处理设备接收到来自4颗卫星的信号后,就可计算出手机当前所在的位置。据说这个位置的偏差最多在100左右。不过,在室里等信号接收条件不好的情况下,GPS定位法就无法施展拳脚了。

    如果你的应用程序想用这个方法,要先判断你的用户的手机是否有GPS信号接收设备。那如何判断又如何去接收信号呢?

       j2me为我们提供了一个可选包jsr179。包中提供了相应的方法。以下是我写的源代码,要装到真机上运行,模拟器上也可以运行,但结果就不是真实的当前坐标了。jsr179的在线帮助文档地址是:http://www.j2megame.org/j2meapi/JSR_179_Location_API_1_0/

   GPS定位源码:

import javax.microedition.lcdui.Command; import javax.microedition.lcdui.Display; import javax.microedition.lcdui.Form; import javax.microedition.location.AddressInfo; import javax.microedition.location.Coordinates; import javax.microedition.location.Location; import javax.microedition.location.LocationException; import javax.microedition.location.LocationProvider; import javax.microedition.midlet.*; /** * @author 彭香香 */ public class testGPS extends MIDlet { private LocationProvider lp; private Location l; private Coordinates c; private double lat; private double lng; private Display dis; private Form form; // 判断手机是否支持 jsr179 这个可选包 private boolean isLocationSupported() { String version = System.getProperty("microedition.location.version"); return (version != null && !version.equals("")) ? true : false; } private void getLocationWithGPS() { try { // 获取GPS信息处理设备 lp = LocationProvider.getInstance(null); if (lp != null) { // 用20秒时间去取位置信息,如果20秒后还没有取到,会报LocationException l = lp.getLocation(20); if (!l.isValid()) { form.append("未取到当前坐标"); } } else { form.append("您的手机不支持GPS定位"); } } catch (InterruptedException ex) { form.append("Interrupted exception"); return; } catch (LocationException ex) { form.append("location exception"); return; } catch (SecurityException ex) { form.append("security exception"); return; } catch (IllegalArgumentException ex) { form.append("exception"); return; } c = l.getQualifiedCoordinates(); lat = c.getLatitude(); lng = c.getLongitude(); form.append("使用GPS定位结果"); form.append("lat:" + String.valueOf(lat)); form.append("lng:" + String.valueOf(lng)); } public void startApp() { dis = Display.getDisplay(this); form = new Form("main form"); if (isLocationSupported()) { getLocationWithGPS(); } dis.setCurrent(form); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } }

再说基站定位法

    基站定位的原理是,应用程序先通过读取系统属性获取到与该手机通讯的基站idcellid以及lac(location area code)(具体获取方法后面再说),将cellid lac 传给某个系统,这个系统就可以给出这个基站所在的坐标。在基站密集的地方,手机与基站距离不远,这个坐标就可以当成是手机所在的坐标了,但是在基站稀疏的地方,这个坐标与实际坐标的偏差便会大。可见基站定位的精确度是不及GPS定位法的。

       之前提到的某个系统,到底是怎样的一个系统呢?可想而知,这个系统拥有着所有基站的位置信息。运营商如移动、联通肯定有自己的基站信息了,你可以找他们去要,当然是要付费的。Google也拥有这些数据,程序员可以免费使用它们。

相关的资料可以参阅:

http://code.google.com/intl/zh-CN/apis/gears/geolocation_network_protocol.html

    基站定位源码:

import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.microedition.io.Connector; import javax.microedition.io.HttpConnection; import javax.microedition.lcdui.Display; import javax.microedition.lcdui.Form; import javax.microedition.midlet.*; /** * @author 彭香香 */ public class GoogleLocation extends MIDlet { private String url = "http://www.google.com/loc/json"; public void startApp() { Display dis = Display.getDisplay(this); Form f = new Form("main"); HttpConnection hc = null; int lac = 9438; int cell_id = 18102; try { hc = (HttpConnection) Connector.open(url); hc.setRequestMethod("POST"); hc.setRequestProperty("Content-Type", "appplication/json"); hc.setRequestProperty("User-Agent","UNTRUSTED/1.0"); String json = "{" + "/"host/":/"maps.google.com/"," + "/"version/":/"1.1.0/"," + "/"cell_towers/":[{/"cell_id/":/"" + cell_id + "/",/"location_area_code/":/"" + lac+ "/"}]}"; OutputStream os = hc.openOutputStream(); os.write(json.getBytes()); InputStream is = hc.openInputStream(); int i = is.available(); byte[] b = new byte[i]; is.read(b); String str = new String(b); int index = str.indexOf("latitude"); if(index != -1){ int latBegin = index + 10; int latEnd = str.indexOf(",", latBegin); String lat = str.substring(latBegin, latEnd); int lngBegin = str.indexOf("longitude") + 11; int lngEnd = str.indexOf(",",lngBegin); String lng = str.substring(lngBegin,lngEnd); f.append("lat:" + lat); f.append("lng:" + lng); } else{ f.append(str); } } catch (IOException ex) { ex.printStackTrace(); f.append(ex.getMessage()); } dis.setCurrent(f); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } }

 

另外,我还在网上找到了其它的供应者,如http://www.anttna.com/

在应用程序中访问 "http://www.anttna.com/cell2gps/cell2gps.php?lac=" +lac+ "&cellid=" + cellid;就可以得到位置信息,包括经纬度和地址。

 

最后再说说如何获取cellidlac。据网上资料说,在程序中写上形如

    lac = System.getProperty("com.samsung.lac");

    cellid = System.getProperty("com.samsung.cellid");

的代码,就可以获取到,不同品牌的手机,传入的属性值会有不同,不过我还没有成功的获取到这两个值,有人说要签了名的midlet才可以获取到手机的这两个属性值,具体如何就再待研究了。大家如有清楚的,也希望不吝赐教。

你可能感兴趣的:(exception,String,null,手机,import,j2me)