Android定位实现(baidu)

  在上一篇中讲到了使用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文档
 
    
 

转载于:https://www.cnblogs.com/new-comer/p/5373594.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值