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显示的位置信息