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針對圖片的讀取、運算、設置等相關操作技巧,需要的朋友可以參考下2017-10-10Android編程布局控件之AbsoluteLayout用法實例分析
這篇文章主要介紹了Android編程布局控件之AbsoluteLayout用法,結合實例形式簡單分析了Android絕對布局AbsoluteLayout的使用技巧,需要的朋友可以參考下2015-12-12Android編程之ListPreference用法實例分析
這篇文章主要介紹了Android編程之ListPreference用法,結合實例形式較為詳細的分析說明了ListPreference的功能、用法及相關注意事項,需要的朋友可以參考下2015-12-12Android?Java?try?catch?失效問題及解決
這篇文章主要介紹了Android?Java?try?catch?失效問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11詳解Recyclerview item中有EditText使用刷新遇到的坑
這篇文章主要介紹了詳解Recyclerview item中有EditText使用刷新遇到的坑,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05