在上一篇中讲到了使用google 提供的API来获得 地理位置信息, 但由于google被禁的原因,所以无法进行反地址编码,所以, 无法获得详细的地址信息,所以,这里转向了baidu定位。
在baidu开发者中心申请ak,然后下载相应的jar包倒入lib中。具体环境配置的方法看百度开发者中心的文档。
我想要实现的功能是,在不通过导入地图的情况下,获得地理位置。
设置AndroidManifest.xml
在application标签中声明service组件,每个app拥有自己单独的定位service
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote">
</service>
【提醒】
定位SDKv3.1版本之后,以下权限已不需要,请取消声明,否则将由于Android 5.0多帐户系统加强权限管理而导致应用安装失败。 <uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE"></uses-permission>
声明使用权限
<!-- 这个权限用于进行网络定位-->
<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>
设置AcessKey
SDK4.2及之后版本需要在Mainfest.xml设置Accesskey,设置有误会引起定位和地理围栏服务不能正常使用,必须进行Accesskey的正确设置。
设置AccessKey,在application标签中加入
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="key" /> //key:开发者申请的key
相关实现代码如下:
locationClient在主线程中定义。
/*
*在撤销时,将locationClient停止
*/
protected void onDestroy(){
super.onDestroy();
if(locationClient != null && locationClient.isStarted()){
locationClient.stop();
locationClient = null;
}
}
/**
*在主线程中进行调用该函数获得相应信息
*/
private void getCurrentCity(){
locationClient = new LocationClient(getApplicationContext());
new Thread(new Runnable(){
@Override
public void run() {
//定位相关配置
LocationClientOption option = new LocationClientOption();
option.setIsNeedAddress(true); //设置是否需要详细的address,这正是我想要的,可以获得城市,省份,街道等
option.setOpenGps(true); //打开GPS;
option.setCoorType("bd0911");//设置返回值的坐标类型
option.setProdName("danmulvxing");
option.setScanSpan(UPDATE_TIME);
locationClient.setLocOption(option);
//注册监听
locationClient.registerLocationListener(new BDLocationListener(){
@Override
public void onReceiveLocation(BDLocation location) {
if(location == null)
{
Message error = new Message();
error.what = NO_LOCATION;
handler.sendMessage(error);
return;
}
Message message = new Message();
message.what = SHOW_CITY;
message.obj = location.getCity();
handler.sendMessage(message);
}
});
//开始定位
locationClient.start();
locationClient.requestLocation();
}
}).start();
}
private Handler handler = new Handler(){
public void handleMessage(Message msg){
switch(msg.what){
case SHOW_CITY:
String city = (String)msg.obj;
Toast.makeText(getApplicationContext(), "City is " + city.substring(0, city.length() - 1), Toast.LENGTH_SHORT).show();
updateSpinnerCity(city.substring(0, city.length() - 1)); //更新城市
break;
case NO_LOCATION:
Toast.makeText(getApplicationContext(), "定位失败,请稍后重试", Toast.LENGTH_SHORT).show();
break;
}
}
};
百度已经实现了很多有用的接口,具体可以查看百度API文档