首页 > 代码库 > Android之百度定位API使用
Android之百度定位API使用
API版本:
百度定位API:V5.0(http://developer.baidu.com/map/wiki/index.php?title=android-locsdk/guide/v5-0)
百度Geocoding API:V2.0(http://developer.baidu.com/map/index.php?title=webapi/guide/webservice-geocoding#7..E9.80.86.E5.9C.B0.E7.90.86.E7.BC.96.E7.A0.81.E6.9C.8D.E5.8A.A1)
使用方法:
1) 申请KEY(http://lbsyun.baidu.com/apiconsole/key?application=key)
创建一个新的应用(注意应用类别是Android SDK),创建完成后,可以获取到一个“访问应用(AK)”的数值。
2) 设置AndroidManifest.xml
在application标签中声明service组件,每个app拥有自己单独的定位service
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"></service>
声明使用权限
<!-- 这个权限用于进行网络定位--><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission><!-- 这个权限用于访问GPS定位--><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission><!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位--><uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission><!-- 获取运营商信息,用于支持提供运营商信息相关的接口--><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission><!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位--><uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission><!-- 用于读取手机当前的状态--><uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission><!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据--><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission><!-- 访问网络,网络定位需要上网--><uses-permission android:name="android.permission.INTERNET" /><!-- SD卡读取权限,用户写入离线定位数据--><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission><!--允许应用读取低级别的系统日志文件 --><uses-permission android:name="android.permission.READ_LOGS"></uses-permission>
在application标签设置AcessKey
<meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="前面申请的访问应用(AK)" />
3) 在Activity或者Fragment里面使用API(未列完整代码,只列出了关键实现部分,这里以在Fragment中举例)
声明成员变量
public LocationClient mLocClient;public MyLocationListener mMyLocationListener;
初始化成员变量
@Overridepublic void onCreate(Bundle arg0) { // TODO Auto-generated method stub super.onCreate(arg0); mLocClient = new LocationClient(getActivity()); mMyLocationListener = new MyLocationListener(); // 百度定位初始化 InitLocation(); // 获取位置信息 startRequestLocation();}
实现回调监听
/** * 实现实位回调监听 */ public class MyLocationListener implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) {// 坐标信息换算成具体位置信息(JSON格式,需要解析) List<NameValuePair> list = new ArrayList<NameValuePair>(); BasicNameValuePair akValuePair = new BasicNameValuePair("ak", "这里填你的AK"); BasicNameValuePair mcodeValuePair = new BasicNameValuePair("mcode", "这里填你的mcode"); BasicNameValuePair locationValuePair = new BasicNameValuePair("location", "32.214283,118.893443"); BasicNameValuePair outputValuePair = new BasicNameValuePair("output", "json"); BasicNameValuePair poisValuePair = new BasicNameValuePair("pois", "0"); list.add(akValuePair); list.add(mcodeValuePair); list.add(locationValuePair); list.add(outputValuePair); list.add(poisValuePair); geoDecoder(list); // 输出到LOG if(D) Log.i(TAG, sb.toString()); // 结束位置信息获取 if (mLocClient != null) { mLocClient.unRegisterLocationListener(mMyLocationListener); mLocClient.stop(); } } }
在线程中调用百度Geocoding API V2.0解析出定位信息对应的地址信息,并放到Handler中进行处理
// 坐标信息换算成具体位置信息(放到线程中去完成,不影响主线程) private void geoDecoder(final List<NameValuePair> list) { new Thread() { public void run() { String url = "http://api.map.baidu.com/geocoder/v2/"; String result = HttpUtil.httpPostClient(url, list); Message msg = new Message(); msg.obj = result; mHandler.sendMessage(msg); }; }.start(); } // 主线程里处理其他线程结果数据 private Handler mHandler = new Handler() { public void handleMessage(android.os.Message msg) { try { GeocoderSearchResponse geocoderSearchResponse = new Gson().fromJson(msg.obj.toString(), GeocoderSearchResponse.class);// 输出到控件 if(geocoderSearchResponse.status.equals("0")){ text_index_location = (TextView) getActivity().findViewById(R.id.text_index_location); text_index_location.setText(geocoderSearchResponse.result.addressComponent.city + geocoderSearchResponse.result.addressComponent.district); }else{ text_index_location = (TextView) getActivity().findViewById(R.id.text_index_location); text_index_location.setText("GPS位置获取失败!ErrCode:" + geocoderSearchResponse.status); } } catch (Exception e) { // TODO: handle exception } }; };
*注意:
1) 使用百度Geocoding API V2.0进行httpClient POST方式请求数据时,需要加一个mcode参数,形如
“XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX;com.XXX.YYY”(就是
申请AK时候填写的安全码)
2) 地址信息的JSON解析时,内部类的参数构成和文档内容不太一致(可能是百度经常会改动类的内容),所以需要
根据实际返回的JSON格式内容去组织类
Android之百度定位API使用