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

发布时间:2019-08-08 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了Android百度地图定位、显示用户当前位置脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

本文实例为大家分享了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&#63;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;  } } 
android教程@H_777_24@ 脚本网站
android studio

脚本宝典总结

以上是脚本宝典为你收集整理的Android百度地图定位、显示用户当前位置全部内容,希望文章能够帮你解决Android百度地图定位、显示用户当前位置所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。