经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » Android » 查看文章
Android百度地图定位、显示用户当前位置
来源:jb51  时间:2019/1/14 9:17:38  对本文有异议

本文实例为大家分享了Android百度地图定位、显示用户当前位置的工具类,供大家参考,具体内容如下

1、构建定位Option的工具类

  1. import com.baidu.location.LocationClientOption;
  2.  
  3. /**
  4. * 建造 LocationClientOption 项
  5. *
  6. * @author peter 2018-12-21 10:58
  7. */
  8. public class LocationClientOptionBuilder {
  9. private LocationClientOption option;
  10.  
  11. public static LocationClientOptionBuilder builder() {
  12. LocationClientOptionBuilder builder = new LocationClientOptionBuilder();
  13. builder.option = builder.initOption();
  14. return builder;
  15. }
  16.  
  17. /**
  18. * 设置坐标系
  19. *
  20. * @return
  21. * @see CoorType
  22. */
  23. public LocationClientOptionBuilder setCoorType() {
  24. return setCoorType(CoorType.bd09ll);
  25. }
  26.  
  27. public LocationClientOptionBuilder setCoorType(CoorType coorType) {
  28. this.option.setCoorType(coorType.name());
  29. return this;
  30. }
  31.  
  32. /**
  33. * 连续定位
  34. * 可选,设置发起定位请求的间隔,int类型,单位ms
  35. * 如果设置为0,则代表单次定位,即仅定位一次,默认为0
  36. * 如果设置非0,需设置1000ms以上才有效
  37. *
  38. * @param time
  39. * @return
  40. */
  41. public LocationClientOptionBuilder setScanSpan(int time) {
  42. this.option.setScanSpan(time);
  43. return this;
  44. }
  45.  
  46. public LocationClientOption bulid() {
  47. return this.option;
  48. }
  49.  
  50. private LocationClientOption initOption() {
  51. LocationClientOption option = new LocationClientOption();
  52. //可选,设置定位模式,默认高精度
  53. //LocationMode.Hight_Accuracy:高精度;
  54. //LocationMode. Battery_Saving:低功耗;
  55. //LocationMode. Device_Sensors:仅使用设备;
  56. option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
  57. //可选,设置返回经纬度坐标类型,默认GCJ02
  58. //GCJ02:国测局坐标;
  59. //BD09ll:百度经纬度坐标;
  60. //BD09:百度墨卡托坐标;
  61. //海外地区定位,无需设置坐标类型,统一返回WGS84类型坐标
  62. // option.setCoorType("bd09ll");
  63.  
  64. //可选,设置发起定位请求的间隔,int类型,单位ms
  65. //如果设置为0,则代表单次定位,即仅定位一次,默认为0
  66. //如果设置非0,需设置1000ms以上才有效
  67. // option.setScanSpan(1000);
  68.  
  69. //可选,设置是否使用gps,默认false
  70. //使用高精度和仅用设备两种定位模式的,参数必须设置为true
  71. option.setOpenGps(true);
  72.  
  73. //可选,设置是否当GPS有效时按照1S/1次频率输出GPS结果,默认false
  74. // option.setLocationNotify(true);
  75. //可选,定位SDK内部是一个service,并放到了独立进程。
  76. //设置是否在stop的时候杀死这个进程,默认(建议)不杀死,即setIgnoreKillProcess(true)
  77. // option.setIgnoreKillProcess(true);
  78.  
  79. //可选,设置是否收集Crash信息,默认收集,即参数为false
  80. // option.SetIgnoreCacheException(false);
  81.  
  82. //可选,V7.2版本新增能力
  83. //如果设置了该接口,首次启动定位时,会先判断当前Wi-Fi是否超出有效期,若超出有效期,会先重新扫描Wi-Fi,然后定位
  84. // option.setWifiCacheTimeOut(5 * 60 * 1000);
  85. //可选,设置是否需要过滤GPS仿真结果,默认需要,即参数为false
  86. // option.setEnableSimulateGps(false);
  87. return option;
  88. }
  89.  
  90. /**
  91. * 坐标系
  92. */
  93. public enum CoorType {
  94. gcj02,
  95. bd09,
  96. bd09ll
  97. }
  98. }
  99.  

2、构建定位的工具类

  1. import android.content.Context;
  2. import android.support.annotation.NonNull;
  3. import android.util.Log;
  4.  
  5. import com.baidu.location.BDAbstractLocationListener;
  6. import com.baidu.location.BDLocation;
  7. import com.baidu.location.LocationClient;
  8. import com.baidu.location.LocationClientOption;
  9.  
  10. /**
  11. * 百度地图定位工具类
  12. *
  13. * @author peter 2018-12-21 10:12
  14. */
  15. public class BMapLocationHelper {
  16.  
  17. private static final int LOCATION_SUCCESS = 1;
  18. static final int LOCATION_FAIL = -1;
  19. private LocationClient mLocationClient;
  20. private MyLocationListener myListener = new MyLocationListener();
  21. private LocationCallBack callBack;
  22.  
  23.  
  24. private BMapLocationHelper(LocationCallBack callBack) {
  25.  
  26. this.callBack = callBack;
  27. }
  28.  
  29. public static BMapLocationHelper create(@NonNull Context context, @NonNull LocationClientOption option, @NonNull LocationCallBack callBack) {
  30. BMapLocationHelper bMapLocationHelper = new BMapLocationHelper(callBack);
  31. LocationClient client = new LocationClient(context);
  32. client.setLocOption(option);
  33. //声明LocationClient类
  34. client.registerLocationListener(bMapLocationHelper.myListener);
  35. bMapLocationHelper.mLocationClient = client;
  36. return bMapLocationHelper;
  37. }
  38.  
  39. /**
  40. * 开始定位
  41. */
  42. public void locStart() {
  43. mLocationClient.start();
  44. }
  45.  
  46. /**
  47. * 停止定位
  48. */
  49. public void locStop() {
  50. mLocationClient.stop();
  51. }
  52.  
  53. public void locReStart() {
  54. mLocationClient.restart();
  55. }
  56.  
  57. public LocationClient getmLocationClient() {
  58. return mLocationClient;
  59. }
  60.  
  61. /**
  62. * 地图定位结果监听类
  63. */
  64. public class MyLocationListener extends BDAbstractLocationListener {
  65. private static final String TAG = "MyLocationListener";
  66.  
  67. @Override
  68. public void onReceiveLocation(BDLocation location) {
  69. if (location == null) return;
  70. int locType = location.getLocType();
  71. int status = LOCATION_SUCCESS;
  72. if (locType != 61 && locType != 161 && locType != 66) status = LOCATION_FAIL;
  73. String errMsg = getLocationResultMsg(locType);
  74. callBack.onReceiveLocation(status, location, errMsg);
  75. }
  76.  
  77. @Override
  78. public void onLocDiagnosticMessage(int i, int i1, String s) {
  79. Log.i(TAG, "onLocDiagnosticMessage: " + i + "diaType:" + i1);
  80. callBack.onLocDiagnosticMessage(i, i1, getLocDiagnosticMessage(i, i1));
  81. super.onLocDiagnosticMessage(i, i1, s);
  82. }
  83. }
  84.  
  85.  
  86. /**
  87. * 回调类
  88. */
  89. public abstract static class LocationCallBack {
  90.  
  91. /**
  92. * 定位的结果
  93. *
  94. * @param statusCode 状态码,1:定位成功,-1定位失败
  95. * @param bdLocation 定位成功时返回的定位结果对象
  96. * @param errMsg 定位失败时的错误信息,成功时则为null
  97. */
  98. public abstract void onReceiveLocation(int statusCode, BDLocation bdLocation, String errMsg);
  99.  
  100. /**
  101. * 错误的状态码
  102. * <a>http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/addition-func/error-code</a>
  103. * <p>
  104. * 回调定位诊断信息,开发者可以根据相关信息解决定位遇到的一些问题
  105. *
  106. * @param locType 当前定位类型
  107. * @param diagnosticType 诊断类型(1~9)
  108. * @param diagnosticMessage 具体的诊断信息释义
  109. */
  110. public void onLocDiagnosticMessage(int locType, int diagnosticType, String diagnosticMessage) {
  111. }
  112. }
  113.  
  114. /**
  115. * 错误的状态码
  116. * <a>http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/addition-func/error-code</a>
  117. *
  118. * @param locType 当前定位类型
  119. * @return String 定位成功或失败的信息
  120. */
  121. private String getLocationResultMsg(int locType) {
  122. switch (locType) {
  123. case 61:
  124. return "GPS定位结果,GPS定位成功";
  125. case 62:
  126. return "无法获取有效定位依据,定位失败,请检查运营商网络或者WiFi网络是否正常开启,尝试重新请求定位";
  127. case 63:
  128. return "网络异常,没有成功向服务器发起请求,请确认当前测试手机网络是否通畅,尝试重新请求定位";
  129. case 66:
  130. return "离线定位结果。通过requestOfflineLocaiton调用时对应的返回结果";
  131. case 67:
  132. return "离线定位失败";
  133. case 161:
  134. return "网络定位结果,网络定位成功";
  135. case 162:
  136. return "请求串密文解析失败,一般是由于客户端SO文件加载失败造成,请严格参照开发指南或demo开发,放入对应SO文件";
  137. case 167:
  138. return "服务端定位失败,请您检查是否禁用获取位置信息权限,尝试重新请求定位";
  139. case 505:
  140. return "AK不存在或者非法,请按照说明文档重新申请AK";
  141. default:
  142. return "";
  143. }
  144. }
  145.  
  146. /**
  147. * @param locType 当前定位类型
  148. * @param diagnosticType 诊断类型(1~9)
  149. * @return String
  150. */
  151. private String getLocDiagnosticMessage(int locType, int diagnosticType) {
  152.  
  153. switch (locType) {
  154. case 62:
  155. switch (diagnosticType) {
  156. case 4:
  157. return "定位失败,无法获取任何有效定位依据";
  158. case 5:
  159. return "定位失败,无法获取有效定位依据,请检查运营商网络或者Wi-Fi网络是否正常开启,尝试重新请求定位";
  160. case 6:
  161. return "定位失败,无法获取有效定位依据,请尝试插入一张sim卡或打开Wi-Fi重试";
  162. case 7:
  163. return "定位失败,飞行模式下无法获取有效定位依据,请关闭飞行模式重试";
  164. case 9:
  165. return "定位失败,无法获取任何有效定位依据";
  166. }
  167. case 67:
  168. if (diagnosticType == 3) return "定位失败,请您检查您的网络状态";
  169.  
  170. case 161:
  171. switch (diagnosticType) {
  172. case 1:
  173. return "定位失败,建议您打开GPS";
  174. case 2:
  175. return "定位失败,建议您打开Wi-Fi";
  176. }
  177. case 167:
  178. if (diagnosticType == 8) return "定位失败,请确认您定位的开关打开状态,是否赋予APP定位权限";
  179.  
  180. default:
  181. return "未知错误";
  182. }
  183. }
  184. }

3、显示用户当前位置到地图的工具类

  1. import android.content.Context;
  2. import android.support.annotation.NonNull;
  3. import android.util.Log;
  4.  
  5. import com.baidu.location.BDLocation;
  6. import com.baidu.location.LocationClientOption;
  7. import com.baidu.mapapi.map.BaiduMap;
  8. import com.baidu.mapapi.map.MapStatus;
  9. import com.baidu.mapapi.map.MapStatusUpdateFactory;
  10. import com.baidu.mapapi.map.MyLocationData;
  11. import com.baidu.mapapi.model.LatLng;
  12. import com.yikesong.sender.util.ToastUtils;
  13.  
  14. /**
  15. * 显示用户当前位置到地图上
  16. *
  17. * @author peter 2018-12-21 16:27
  18. */
  19. public class UserLocation extends BMapLocationHelper.LocationCallBack {
  20. private Context context;
  21. private boolean isFirstLoc = true;
  22. private BaiduMap map;
  23. private int mCurrentDirection = 0;
  24. private BMapLocationHelper helper;
  25. private static final String TAG = "UserLocation";
  26.  
  27. public UserLocation(@NonNull Context context, @NonNull BaiduMap map) {
  28. this.context = context;
  29. this.map = map;
  30. init();
  31. }
  32.  
  33. private void init() {
  34. map.setMapType(BaiduMap.MAP_TYPE_NORMAL);
  35. //开启定位图层
  36. map.setMyLocationEnabled(true);
  37. }
  38.  
  39. /**
  40. * 在地图上显示用户的当前位置
  41. */
  42. public void showUserLocationOnMap() {
  43. if (helper == null) {
  44. LocationClientOption option = LocationClientOptionBuilder
  45. .builder()
  46. .setCoorType()
  47. .bulid();
  48. helper = BMapLocationHelper.create(this.context, option, this);
  49. }
  50. helper.locStart();
  51. }
  52.  
  53. @Override
  54. public void onReceiveLocation(int statusCode, BDLocation bdLocation, String errMsg) {
  55. if (statusCode == BMapLocationHelper.LOCATION_FAIL) {
  56. ToastUtils.toastInfo(errMsg, context);
  57. Log.i(TAG, "onReceiveLocation: " + errMsg);
  58. return;
  59. }
  60. MyLocationData locData = new MyLocationData.Builder()
  61. .accuracy(bdLocation.getRadius())
  62. // 此处设置开发者获取到的方向信息,顺时针0-360
  63. .direction(mCurrentDirection).latitude(bdLocation.getLatitude())
  64. .longitude(bdLocation.getLongitude()).build();
  65. map.setMyLocationData(locData);
  66. if (isFirstLoc) {
  67. isFirstLoc = false;
  68. LatLng centerPoint = new LatLng(bdLocation.getLatitude(),
  69. bdLocation.getLongitude());
  70. MapStatus mapStatus = new MapStatus.Builder()
  71. .target(centerPoint) //设置中心点
  72. .zoom(18f)//设置缩放级别
  73. .build();
  74. map.animateMapStatus(MapStatusUpdateFactory.newMapStatus(mapStatus));
  75. }
  76. if (helper != null) helper.locStop();
  77. }
  78.  
  79. @Override
  80. public void onLocDiagnosticMessage(int locType, int diagnosticType, String diagnosticMessage) {
  81. super.onLocDiagnosticMessage(locType, diagnosticType, diagnosticMessage);
  82. }
  83.  
  84. public BMapLocationHelper getHelper() {
  85. return helper;
  86. }
  87.  
  88. public BaiduMap getMap() {
  89. return map;
  90. }
  91.  
  92. public int getmCurrentDirection() {
  93. return mCurrentDirection;
  94. }
  95. }
  96.  

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号