百度地图定位SDKv4.2版本(android)的使用教程
16lz
2021-01-23
百度官方定位SDK的网址:请点击--> Android 定位SDK
百度地图SDK从2.0.0版本起,将定位功能进行了分离,开发者在使用过程中,若需要定位功能,请参考Android 定位SDK的相关介绍。
上一篇博客中用到BaiduLocationer这个类,上篇博客里说会专门把这个类写出来,现在我来补充关于定位的类。
当时我在activity中的定位是这么用的: - //启用定位
- BaiduLocationerbaiduLocationer=newBaiduLocationer(getThis());
这句代码就是启动定位,定位成功之后 就会执行Acitivity的 opratBDLocation方法。
这个类的源码如下:
import android.app.Activity;import android.content.Context;import android.os.Handler;import android.widget.Toast;import com.baidu.location.BDLocation;import com.baidu.location.BDLocationListener;import com.baidu.location.LocationClient;import com.baidu.location.LocationClientOption;import com.oki.lyw.activity.BaseActivity;import com.oki.lyw.activity.LYApplication;import com.oki.lyw.activity.baidumap.LBSMapActivity;import com.oki.lyw.activity.baidumap.LBSSearchListActivity;import com.oki.utils.activity.ActivityManager;import com.oki.utils.activity.ActivityUtil;//这个类的使用方法 是直接调用 实例化即可// BaiduLocationer(Context context) /* *如果定位出现问题,可能是如下原因 * 1. key有问题 * 安全码 如: 05:14:10:66:8D:19:2D:35:03:DF:47:A9:97:5B:E2:10:02:98:6D:08:com.oki.lyw.activity * 安全码里面有包名 新项目要去百度重新申请key * 2. liblocSDK4d.so 没有导入 * 3. 服务 service android:name="com.baidu.location.f" 没有加上来 * 4. 如果定位不稳定但是可以定位到的话 就可能是 版本问题 * */public class BaiduLocationer { Handler lochandler; Context mContext; private LocationClient locationClient = null; private static final int UPDATE_TIME=100; public BaiduLocationer(Context context)//实例化并启动 { //启动定位 lochandler= new Handler(); mContext=context; lochandler.post(getpositionrunnable); }
<span style="white-space:pre"></span>//当new Locationer(this) 获取定位信息之后 定位会自动停止,如果还想启动定位 则需要调用此方法。 public void startLocation() { lochandler.post(getpositionrunnable); } //后台获取经纬度的线程 Runnable getpositionrunnable = new Runnable() { @Override public void run() { try { locationClient = new LocationClient(mContext.getApplicationContext()); locationClient.registerLocationListener(new BDLocationListener() { @Override public void onReceiveLocation(BDLocation location) { // TODO Auto-generated method stub // TODO Auto-generated method stub if (location == null) { return; } if (location.getLatitude() > 1 && location.getLongitude() > 1) { stopLoc(); if(((Activity)mContext).isFinishing())//如果当前的Activity已经被finish掉了) return; if(mContext instanceof BaseActivity) ((BaseActivity)mContext).opratBDLocation(location); else if(mContext instanceof LBSMapActivity) { ((LBSMapActivity)mContext).opratBDLocation(location); } else if(mContext instanceof LBSSearchListActivity) { ((LBSSearchListActivity)mContext).opratBDLocation(location); } else Toast.makeText(mContext,"Context不是BaseActivity实例化的对象",Toast.LENGTH_LONG).show(); } } }); //设置定位条件 LocationClientOption option = new LocationClientOption(); option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors); option.setOpenGps(true);// 打开gps option.setCoorType("bd09ll"); // 设置坐标类型gcj02,bd09ll option.setOpenGps(true); option.setScanSpan(UPDATE_TIME); option.setIsNeedAddress(true); locationClient.setLocOption(option); //注册位置监听器 locationClient.start(); } catch (Exception e) { Toast.makeText(mContext, "经纬度获取失败,请打开GPS和网络", Toast.LENGTH_LONG).show(); } } }; public void stopLoc() { //非空切未启动时停止定位 if(locationClient!=null&&locationClient.isStarted()) locationClient.stop(); lochandler.removeCallbacks(getpositionrunnable);//终止线程 }}
MainFast.xml文件如下:
<!-- 这个权限用于进行网络定位--><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>
<!--百度地图begin--> <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="ZgBXO2qnqD6ZafTWn0ucV63G" /> <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote" > </service> <!--百度地图end-->
补充: 1.如果你的程序执行不到onReceiveLocation(BDLocation location)这个方法, 可能是 你Mainfast.xml文件没写对,定位服务没加进来,请下载官方的demo进行比对。
2.如果定位能执行到 onReceiveLocation(BDLocation location) 但是很慢,捕捉到位置信息需要15s以上,可能是当前你是用的版本是X.0的版本,X.0的版本不如 X.1/X.2/X.3的版本稳定。亦或者你的key有问题,这个代码里我已经写了,key要注意的,加入你项目的报名更改了,就要重新申请密钥。注意包名哦!
3.我的项目几乎每个Acitivty都继承于BaseActivity 所以我在BaseActivity中写了个 opratBDLocation方法,每个继承者 需要定位的话 只需要BaiduLocationerbaiduLocationer=newBaiduLocationer(getThis()); 这样就启动了定位服务,在重构 opratBDLOcation方法,当定位成功时就会执行opratBDLocation方法。
if(mContext instanceof BaseActivity) ((BaseActivity)mContext).opratBDLocation(location);4.我当前使用的SDK版本是4.2,而我之前用3.X版本也是可以的。定位改动不大,但是百度地图的SDK,现在是3.1。而之前的2.X版本的代码拿过来统统不能用了。
更多相关文章
- Android webview和js互相调用实现方法
- Android的持续化集成及多版本打包
- 深入解析android log的分析方法(1)
- Android增量升级的方法和原理
- android ListView常见问题解决方法(滚动背景变黑,去除滑动时阴影,拖
- Android程序调试–LogCat按照日志信息级别进行输出和过滤