Android百度地图定位、显示用户当前位置

作者:miskss 时间:2021-08-20 04:47:05 

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

1、构建定位Option的工具类


import com.baidu.location.LocationClientOption;

/**
* 建造 LocationClientOption 项
*
* @author peter 2018-12-21 10:58
*/
public class LocationClientOptionBuilder {
private LocationClientOption option;

public static LocationClientOptionBuilder builder() {
 LocationClientOptionBuilder builder = new LocationClientOptionBuilder();
 builder.option = builder.initOption();
 return builder;
}

/**
 * 设置坐标系
 *
 * @return
 * @see CoorType
 */
public LocationClientOptionBuilder setCoorType() {
 return setCoorType(CoorType.bd09ll);
}

public LocationClientOptionBuilder setCoorType(CoorType coorType) {
 this.option.setCoorType(coorType.name());
 return this;
}

/**
 * 连续定位
 * 可选,设置发起定位请求的间隔,int类型,单位ms
 * 如果设置为0,则代表单次定位,即仅定位一次,默认为0
 * 如果设置非0,需设置1000ms以上才有效
 *
 * @param time
 * @return
 */
public LocationClientOptionBuilder setScanSpan(int time) {
 this.option.setScanSpan(time);
 return this;
}

public LocationClientOption bulid() {
 return this.option;
}

private LocationClientOption initOption() {
 LocationClientOption option = new LocationClientOption();
 //可选,设置定位模式,默认高精度
 //LocationMode.Hight_Accuracy:高精度;
 //LocationMode. Battery_Saving:低功耗;
 //LocationMode. Device_Sensors:仅使用设备;
 option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
 //可选,设置返回经纬度坐标类型,默认GCJ02
 //GCJ02:国测局坐标;
 //BD09ll:百度经纬度坐标;
 //BD09:百度墨卡托坐标;
 //海外地区定位,无需设置坐标类型,统一返回WGS84类型坐标
//  option.setCoorType("bd09ll");

//可选,设置发起定位请求的间隔,int类型,单位ms
 //如果设置为0,则代表单次定位,即仅定位一次,默认为0
 //如果设置非0,需设置1000ms以上才有效
//  option.setScanSpan(1000);

//可选,设置是否使用gps,默认false
 //使用高精度和仅用设备两种定位模式的,参数必须设置为true
 option.setOpenGps(true);

//可选,设置是否当GPS有效时按照1S/1次频率输出GPS结果,默认false
//  option.setLocationNotify(true);
 //可选,定位SDK内部是一个service,并放到了独立进程。
 //设置是否在stop的时候杀死这个进程,默认(建议)不杀死,即setIgnoreKillProcess(true)
//  option.setIgnoreKillProcess(true);

//可选,设置是否收集Crash信息,默认收集,即参数为false
//  option.SetIgnoreCacheException(false);

//可选,V7.2版本新增能力
 //如果设置了该接口,首次启动定位时,会先判断当前Wi-Fi是否超出有效期,若超出有效期,会先重新扫描Wi-Fi,然后定位
//  option.setWifiCacheTimeOut(5 * 60 * 1000);
 //可选,设置是否需要过滤GPS仿真结果,默认需要,即参数为false
//  option.setEnableSimulateGps(false);
 return option;
}

/**
 * 坐标系
 */
public enum CoorType {
 gcj02,
 bd09,
 bd09ll
}
}

2、构建定位的工具类


import android.content.Context;
import android.support.annotation.NonNull;
import android.util.Log;

import com.baidu.location.BDAbstractLocationListener;
import com.baidu.location.BDLocation;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;

/**
* 百度地图定位工具类
*
* @author peter 2018-12-21 10:12
*/
public class BMapLocationHelper {

private static final int LOCATION_SUCCESS = 1;
static final int LOCATION_FAIL = -1;
private LocationClient mLocationClient;
private MyLocationListener myListener = new MyLocationListener();
private LocationCallBack callBack;

private BMapLocationHelper(LocationCallBack callBack) {

this.callBack = callBack;
}

public static BMapLocationHelper create(@NonNull Context context, @NonNull LocationClientOption option, @NonNull LocationCallBack callBack) {
 BMapLocationHelper bMapLocationHelper = new BMapLocationHelper(callBack);
 LocationClient client = new LocationClient(context);
 client.setLocOption(option);
 //声明LocationClient类
 client.registerLocationListener(bMapLocationHelper.myListener);
 bMapLocationHelper.mLocationClient = client;
 return bMapLocationHelper;
}

/**
 * 开始定位
 */
public void locStart() {
 mLocationClient.start();
}

/**
 * 停止定位
 */
public void locStop() {
 mLocationClient.stop();
}

public void locReStart() {
 mLocationClient.restart();
}

public LocationClient getmLocationClient() {
 return mLocationClient;
}

/**
 * 地图定位结果监听类
 */
public class MyLocationListener extends BDAbstractLocationListener {
 private static final String TAG = "MyLocationListener";

@Override
 public void onReceiveLocation(BDLocation location) {
  if (location == null) return;
  int locType = location.getLocType();
  int status = LOCATION_SUCCESS;
  if (locType != 61 && locType != 161 && locType != 66) status = LOCATION_FAIL;
  String errMsg = getLocationResultMsg(locType);
  callBack.onReceiveLocation(status, location, errMsg);
 }

@Override
 public void onLocDiagnosticMessage(int i, int i1, String s) {
  Log.i(TAG, "onLocDiagnosticMessage: " + i + "diaType:" + i1);
  callBack.onLocDiagnosticMessage(i, i1, getLocDiagnosticMessage(i, i1));
  super.onLocDiagnosticMessage(i, i1, s);
 }
}

/**
 * 回调类
 */
public abstract static class LocationCallBack {

/**
  * 定位的结果
  *
  * @param statusCode 状态码,1:定位成功,-1定位失败
  * @param bdLocation 定位成功时返回的定位结果对象
  * @param errMsg  定位失败时的错误信息,成功时则为null
  */
 public abstract void onReceiveLocation(int statusCode, BDLocation bdLocation, String errMsg);

/**
  * 错误的状态码
  * <a>http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/addition-func/error-code</a>
  * <p>
  * 回调定位诊断信息,开发者可以根据相关信息解决定位遇到的一些问题
  *
  * @param locType   当前定位类型
  * @param diagnosticType 诊断类型(1~9)
  * @param diagnosticMessage 具体的诊断信息释义
  */
 public void onLocDiagnosticMessage(int locType, int diagnosticType, String diagnosticMessage) {
 }
}

/**
 * 错误的状态码
 * <a>http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/addition-func/error-code</a>
 *
 * @param locType 当前定位类型
 * @return String 定位成功或失败的信息
 */
private String getLocationResultMsg(int locType) {
 switch (locType) {
  case 61:
   return "GPS定位结果,GPS定位成功";
  case 62:
   return "无法获取有效定位依据,定位失败,请检查运营商网络或者WiFi网络是否正常开启,尝试重新请求定位";
  case 63:
   return "网络异常,没有成功向服务器发起请求,请确认当前测试手机网络是否通畅,尝试重新请求定位";
  case 66:
   return "离线定位结果。通过requestOfflineLocaiton调用时对应的返回结果";
  case 67:
   return "离线定位失败";
  case 161:
   return "网络定位结果,网络定位成功";
  case 162:
   return "请求串密文解析失败,一般是由于客户端SO文件加载失败造成,请严格参照开发指南或demo开发,放入对应SO文件";
  case 167:
   return "服务端定位失败,请您检查是否禁用获取位置信息权限,尝试重新请求定位";
  case 505:
   return "AK不存在或者非法,请按照说明文档重新申请AK";
  default:
   return "";
 }
}

/**
 * @param locType  当前定位类型
 * @param diagnosticType 诊断类型(1~9)
 * @return String
 */
private String getLocDiagnosticMessage(int locType, int diagnosticType) {

switch (locType) {
  case 62:
   switch (diagnosticType) {
    case 4:
     return "定位失败,无法获取任何有效定位依据";
    case 5:
     return "定位失败,无法获取有效定位依据,请检查运营商网络或者Wi-Fi网络是否正常开启,尝试重新请求定位";
    case 6:
     return "定位失败,无法获取有效定位依据,请尝试插入一张sim卡或打开Wi-Fi重试";
    case 7:
     return "定位失败,飞行模式下无法获取有效定位依据,请关闭飞行模式重试";
    case 9:
     return "定位失败,无法获取任何有效定位依据";
   }
  case 67:
   if (diagnosticType == 3) return "定位失败,请您检查您的网络状态";

case 161:
   switch (diagnosticType) {
    case 1:
     return "定位失败,建议您打开GPS";
    case 2:
     return "定位失败,建议您打开Wi-Fi";
   }
  case 167:
   if (diagnosticType == 8) return "定位失败,请确认您定位的开关打开状态,是否赋予APP定位权限";

default:
   return "未知错误";
 }
}
}

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


import android.content.Context;
import android.support.annotation.NonNull;
import android.util.Log;

import com.baidu.location.BDLocation;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;
import com.yikesong.sender.util.ToastUtils;

/**
* 显示用户当前位置到地图上
*
* @author peter 2018-12-21 16:27
*/
public class UserLocation extends BMapLocationHelper.LocationCallBack {
private Context context;
private boolean isFirstLoc = true;
private BaiduMap map;
private int mCurrentDirection = 0;
private BMapLocationHelper helper;
private static final String TAG = "UserLocation";

public UserLocation(@NonNull Context context, @NonNull BaiduMap map) {
 this.context = context;
 this.map = map;
 init();
}

private void init() {
 map.setMapType(BaiduMap.MAP_TYPE_NORMAL);
 //开启定位图层
 map.setMyLocationEnabled(true);
}

/**
 * 在地图上显示用户的当前位置
 */
public void showUserLocationOnMap() {
 if (helper == null) {
  LocationClientOption option = LocationClientOptionBuilder
    .builder()
    .setCoorType()
    .bulid();
  helper = BMapLocationHelper.create(this.context, option, this);
 }
 helper.locStart();
}

@Override
public void onReceiveLocation(int statusCode, BDLocation bdLocation, String errMsg) {
 if (statusCode == BMapLocationHelper.LOCATION_FAIL) {
  ToastUtils.toastInfo(errMsg, context);
  Log.i(TAG, "onReceiveLocation: " + errMsg);
  return;
 }
 MyLocationData locData = new MyLocationData.Builder()
   .accuracy(bdLocation.getRadius())
   // 此处设置开发者获取到的方向信息,顺时针0-360
   .direction(mCurrentDirection).latitude(bdLocation.getLatitude())
   .longitude(bdLocation.getLongitude()).build();
 map.setMyLocationData(locData);
 if (isFirstLoc) {
  isFirstLoc = false;
  LatLng centerPoint = new LatLng(bdLocation.getLatitude(),
    bdLocation.getLongitude());
  MapStatus mapStatus = new MapStatus.Builder()
    .target(centerPoint) //设置中心点
    .zoom(18f)//设置缩放级别
    .build();
  map.animateMapStatus(MapStatusUpdateFactory.newMapStatus(mapStatus));
 }
 if (helper != null) helper.locStop();
}

@Override
public void onLocDiagnosticMessage(int locType, int diagnosticType, String diagnosticMessage) {
 super.onLocDiagnosticMessage(locType, diagnosticType, diagnosticMessage);
}

public BMapLocationHelper getHelper() {
 return helper;
}

public BaiduMap getMap() {
 return map;
}

public int getmCurrentDirection() {
 return mCurrentDirection;
}
}

来源:https://blog.csdn.net/wanping321/article/details/85990561

标签:Android,百度地图
0
投稿

猜你喜欢

  • java多线程加锁以及Condition类的使用实例解析

    2023-08-07 07:25:30
  • Java框架解说之BIO NIO AIO不同IO模型演进之路

    2021-06-20 22:56:31
  • Unity Shader实现裁切效果

    2023-03-05 07:54:24
  • Android Studio使用小技巧:提取方法代码片段

    2023-11-14 19:35:20
  • Android实现捕获未知异常并提交给服务器的方法

    2022-07-15 23:49:29
  • Java中mybatis的三种分页方式

    2021-06-25 11:14:05
  • Android使用ListView批量删除item的方法

    2022-05-01 01:11:17
  • 简单谈谈java自定义注解

    2021-07-21 18:40:53
  • Springboot项目与vue项目整合打包的实现方式

    2022-01-14 19:25:03
  • Java 基于tcp协议实现文件上传

    2022-04-14 04:01:29
  • android自定义view之模拟qq消息拖拽删除效果

    2023-01-29 11:48:34
  • springboot2启动时执行,初始化(或定时任务)servletContext问题

    2022-10-18 13:14:30
  • Java开发岗位面试被问到反射怎么办

    2023-01-07 00:09:12
  • java~springboot~ibatis数组in查询的实现方法

    2023-03-31 21:31:13
  • JAVA实现经典扫雷游戏的示例代码

    2022-01-26 04:20:18
  • C# WORD操作实现代码

    2023-11-20 05:16:25
  • Java shiro安全框架使用介绍

    2023-07-09 05:24:35
  • Android通知栏微技巧一些需要注意的小细节

    2021-10-07 12:40:59
  • 详解spring boot rest例子

    2021-06-02 21:54:46
  • springboot相关面试题汇总详解

    2023-10-06 17:16:11
  • asp之家 软件编程 m.aspxhome.com