android LBS的定位源码解析

GPS定位能提供精确, 详细的数据。但是有的时候我们不能通过GPS获得数据,如在屋子里面,无GPS功能等情况。那我们就需要其他的定位手段,基站定位是一个不错的选择。

当我们手机开机时,手机会自动向信号最强的无线通讯台联系,注册信息,这个通讯台就是我们所说的基站,每个基站都有自己的id,我们通过这个基站的id能够找到基站的位置,而国内城市的基站密度可以达到500米以下或者更低,所以能够大体上确定我们的位置。

准备工具:

1. TelephonyManager: 主要提供了一系列用于访问与手机通讯相关的状态和信息的get方法。其中包括手机SIM的状态和信息、电信网络的状态及手机用户的信息。在这里我们就是通过这个类获得基站信息。

 

2. GsmCellLocation:装载着从TelephonyManager中获得的信息。

 

3. JSONObject,JSONArray:组建json相关的类。

 

4. 联网相关的类。

代码:

1.启动按钮和画板

mTextView = (TextView) findViewById(R.id.textview);

mButton = (Button) findViewById(R.id.button);

 

2.获得基站信息

 

mTManager = (TelephonyManager) this

.getSystemService(Context.TELEPHONY_SERVICE);

GsmCellLocation gcl = (GsmCellLocation) mTManager.getCellLocation();

int cid = gcl.getCid();

int lac = gcl.getLac();

int mcc = Integer.valueOf(mTManager.getNetworkOperator().substring(0,

3));

int mnc = Integer.valueOf(mTManager.getNetworkOperator().substring(3,

5));

String getNumber = "";

getNumber += ("cid:"+cid + "\n");

getNumber += ("cid:"+lac + "\n");

getNumber += ("cid:"+mcc + "\n");

getNumber += ("cid:"+mnc + "\n");

 

3.创建json

 

try {

JSONObject jObject = new JSONObject();

jObject.put("version", "1.1.0");

jObject.put("host", "maps.google.com");

jObject.put("request_address", true);

if (mcc == 460) {

jObject.put("address_language", "zh_CN");

} else {

jObject.put("address_language", "en_US");

}

JSONArray jArray = new JSONArray();

JSONObject jData = new JSONObject();

jData.put("cell_id", cid);

jData.put("location_area_code", lac);

jData.put("mobile_country_code", mcc);

jData.put("mobile_network_code", mnc);

jArray.put(jData);

jObject.put("cell_towers", jArray);

 

4. 创建连接,发送请求并接受回应

DefaultHttpClient client = new DefaultHttpClient();

 

HttpPost post = new HttpPost(

"http://www.google.com/loc/json");

 

StringEntity se = new StringEntity(jObject.toString());

 

post.setEntity(se);

HttpResponse resp = client.execute(post);

 

BufferedReader br = null;

if (resp.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {

br = new BufferedReader(

new InputStreamReader(resp.getEntity().getContent()));

StringBuffer sb = new StringBuffer();

}

5. 获得数据 参见json Server Response

StringBuffer sb = new StringBuffer();

String result = br.readLine();

 

while (result != null) {

sb.append(getNumber);

sb.append(result);

result = br.readLine();

}

mTextView.setText(sb.toString());

能力:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

以下是GPS定位方式

获取位置信息分为三步:
1. 添加系统权限,来支持对LBS硬件的访问
   <uses-permission    android:name="android.permission.ACCESS_FINE_LOCATION">
  </uses-permission>

2. 得到系统服务 的LocationManager 对象     
         LocationManager loctionManager;
        String contextService=Context.LOCATION_SERVICE;
        //通过系统服务,取得LocationManager对象
        loctionManager=(LocationManager) getSystemService(contextService);

3. 得到位置提供器,通过位置提供器,得到位置信息,可以指定具体的位置提供器,也可以提供一个标准集合,让系统根据 标准匹配最适合的位置提供器,位置信息是由位置提供其提供的。
     a.   通过GPS位置提供器获得位置(指定具体的位置提供器)
        String provider=LocationManager.GPS_PROVIDER;
       Location location = loctionManager.getLastKnownLocation(provider);
       
     b. 使用标准集合,让系统自动选择可用的最佳位置提供器,提供位置
        Criteria criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_FINE);//高精度
        criteria.setAltitudeRequired(false);//不要求海拔
        criteria.setBearingRequired(false);//不要求方位
        criteria.setCostAllowed(true);//允许有花费
        criteria.setPowerRequirement(Criteria.POWER_LOW);//低功耗

       //从可用的位置提供器中,匹配以上标准的最佳提供器
        String provider = loctionManager.getBestProvider(criteria, true);
       
        //获得最后一次变化的位置
        Location location = loctionManager.getLastKnownLocation(provider);

最后将位置信息显示在TextView中,如图:


监听位置的变化
        //监听位置变化,2秒一次,距离10米以上
        loctionManager.requestLocationUpdates(provider, 2000, 10, locationListener);

//位置监听器
    private final LocationListener locationListener = new LocationListener() {
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
//当位置变化时触发
@Override
public void onLocationChanged(Location location) {
//使用新的location更新TextView显示
updateWithNewLocation(location);
}
};

通过改变位置经纬度,程序会自动更新TextView显示的位置信息

posted on 2012-01-13 14:41  苏桓(osbert)  阅读(5121)  评论(0编辑  收藏  举报

导航