欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android百度地圖定位、顯示用戶當前位置

 更新時間:2019年01月12日 08:49:18   作者:miskss  
這篇文章主要為大家詳細介紹了Android百度地圖定位、顯示用戶當前位置,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了Android百度地圖定位、顯示用戶當前位置的工具類,供大家參考,具體內(nèi)容如下

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;
 }

 /**
  * 連續(xù)定位
  * 可選,設置發(fā)起定位請求的間隔,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);
  //可選,設置返回經(jīng)緯度坐標類型,默認GCJ02
  //GCJ02:國測局坐標;
  //BD09ll:百度經(jīng)緯度坐標;
  //BD09:百度墨卡托坐標;
  //海外地區(qū)定位,無需設置坐標類型,統(tǒng)一返回WGS84類型坐標
//  option.setCoorType("bd09ll");

  //可選,設置發(fā)起定位請求的間隔,int類型,單位ms
  //如果設置為0,則代表單次定位,即僅定位一次,默認為0
  //如果設置非0,需設置1000ms以上才有效
//  option.setScanSpan(1000);

  //可選,設置是否使用gps,默認false
  //使用高精度和僅用設備兩種定位模式的,參數(shù)必須設置為true
  option.setOpenGps(true);

  //可選,設置是否當GPS有效時按照1S/1次頻率輸出GPS結果,默認false
//  option.setLocationNotify(true);
  //可選,定位SDK內(nèi)部是一個service,并放到進程。
//  option.setIgnoreKillProcess(true);

  //可選,設置是否收集Crash信息,默認收集,即參數(shù)為false
//  option.SetIgnoreCacheException(false);

  //可選,V7.2版本新增能力
  //如果設置了該接口,首次啟動定位時,會先判斷當前Wi-Fi是否超出有效期,若超出有效期,會先重新掃描Wi-Fi,然后定位
//  option.setWifiCacheTimeOut(5 * 60 * 1000);
  //可選,設置是否需要過濾GPS結果,默認需要,即參數(shù)為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 狀態(tài)碼,1:定位成功,-1定位失敗
   * @param bdLocation 定位成功時返回的定位結果對象
   * @param errMsg  定位失敗時的錯誤信息,成功時則為null
   */
  public abstract void onReceiveLocation(int statusCode, BDLocation bdLocation, String errMsg);

  /**
   * 錯誤的狀態(tài)碼
   * <a>http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/addition-func/error-code</a>
   * <p>
   * 回調定位診斷信息,開發(fā)者可以根據(jù)相關信息解決定位遇到的一些問題
   *
   * @param locType   當前定位類型
   * @param diagnosticType 診斷類型(1~9)
   * @param diagnosticMessage 具體的診斷信息釋義
   */
  public void onLocDiagnosticMessage(int locType, int diagnosticType, String diagnosticMessage) {
  }
 }

 /**
  * 錯誤的狀態(tài)碼
  * <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 "無法獲取有效定位依據(jù),定位失敗,請檢查運營商網(wǎng)絡或者WiFi網(wǎng)絡是否正常開啟,嘗試重新請求定位";
   case 63:
    return "網(wǎng)絡異常,沒有成功向服務器發(fā)起請求,請確認當前測試手機網(wǎng)絡是否通暢,嘗試重新請求定位";
   case 66:
    return "離線定位結果。通過requestOfflineLocaiton調用時對應的返回結果";
   case 67:
    return "離線定位失敗";
   case 161:
    return "網(wǎng)絡定位結果,網(wǎng)絡定位成功";
   case 162:
    return "請求串密文解析失敗,一般是由于客戶端SO文件加載失敗造成,請嚴格參照開發(fā)指南或demo開發(fā),放入對應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 "定位失敗,無法獲取任何有效定位依據(jù)";
     case 5:
      return "定位失敗,無法獲取有效定位依據(jù),請檢查運營商網(wǎng)絡或者Wi-Fi網(wǎng)絡是否正常開啟,嘗試重新請求定位";
     case 6:
      return "定位失敗,無法獲取有效定位依據(jù),請嘗試插一張sim卡或打開Wi-Fi重試";
     case 7:
      return "定位失敗,飛行模式下無法獲取有效定位依據(jù),請關閉飛行模式重試";
     case 9:
      return "定位失敗,無法獲取任何有效定位依據(jù)";
    }
   case 67:
    if (diagnosticType == 3) return "定位失敗,請您檢查您的網(wǎng)絡狀態(tài)";

   case 161:
    switch (diagnosticType) {
     case 1:
      return "定位失敗,建議您打開GPS";
     case 2:
      return "定位失敗,建議您打開Wi-Fi";
    }
   case 167:
    if (diagnosticType == 8) return "定位失敗,請確認您定位的開關打開狀態(tài),是否賦予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())
    // 此處設置開發(fā)者獲取到的方向信息,順時針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;
 }
}

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Android開發(fā)中使用顏色矩陣改變圖片顏色,透明度及亮度的方法

    Android開發(fā)中使用顏色矩陣改變圖片顏色,透明度及亮度的方法

    這篇文章主要介紹了Android開發(fā)中使用顏色矩陣改變圖片顏色,透明度及亮度的方法,涉及Android針對圖片的讀取、運算、設置等相關操作技巧,需要的朋友可以參考下
    2017-10-10
  • Android截屏分享功能

    Android截屏分享功能

    最近項目經(jīng)理交給我一個任務,要求實現(xiàn)android截屏功能,包括Android截屏獲取圖片、將圖片保存到本地、通知系統(tǒng)相冊更新、通過微信、QQ、微博分享截屏圖片。小編把實現(xiàn)思路分享到腳本之家平臺,需要的朋友參考下
    2017-12-12
  • Android快速分析apk工具aapt的使用教程

    Android快速分析apk工具aapt的使用教程

    這篇文章主要介紹了Android快速分析apk工具aapt的使用教程,本文講解了什么是aapt、主要用法、使用aapt、查看apk的基本信息、查看基本信息、查看應用權限等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • Android編程布局控件之AbsoluteLayout用法實例分析

    Android編程布局控件之AbsoluteLayout用法實例分析

    這篇文章主要介紹了Android編程布局控件之AbsoluteLayout用法,結合實例形式簡單分析了Android絕對布局AbsoluteLayout的使用技巧,需要的朋友可以參考下
    2015-12-12
  • Android編程之ListPreference用法實例分析

    Android編程之ListPreference用法實例分析

    這篇文章主要介紹了Android編程之ListPreference用法,結合實例形式較為詳細的分析說明了ListPreference的功能、用法及相關注意事項,需要的朋友可以參考下
    2015-12-12
  • Android?Java?try?catch?失效問題及解決

    Android?Java?try?catch?失效問題及解決

    這篇文章主要介紹了Android?Java?try?catch?失效問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 詳解Recyclerview item中有EditText使用刷新遇到的坑

    詳解Recyclerview item中有EditText使用刷新遇到的坑

    這篇文章主要介紹了詳解Recyclerview item中有EditText使用刷新遇到的坑,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • android 支持的語言列表(匯總)

    android 支持的語言列表(匯總)

    本篇文章是對android支持的語言進行了部分匯總,需要的朋友參考下
    2013-06-06
  • Android 實現(xiàn)加載大圖片的方法

    Android 實現(xiàn)加載大圖片的方法

    對于超大的圖片,如果不縮放的話,容易導致內(nèi)存溢出。而經(jīng)過處理后,無論多大的圖片,都能夠在手機屏幕上加載出來,不會導致內(nèi)存溢出。本文將對Android 加載大圖片的實現(xiàn)方法進行介紹,下面跟著小編一起來看下吧
    2017-04-04
  • Android中修改設備權限的方法

    Android中修改設備權限的方法

    這篇文章主要介紹了Android中修改設備權限的方法,涉及Android源碼中設備權限的修改技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10

最新評論