Android百度地圖定位、顯示用戶當(dāng)前位置
本文實(shí)例為大家分享了Android百度地圖定位、顯示用戶當(dāng)前位置的工具類,供大家參考,具體內(nèi)容如下
1、構(gòu)建定位Option的工具類
import com.baidu.location.LocationClientOption;
/**
* 建造 LocationClientOption 項(xiàng)
*
* @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;
}
/**
* 設(shè)置坐標(biāo)系
*
* @return
* @see CoorType
*/
public LocationClientOptionBuilder setCoorType() {
return setCoorType(CoorType.bd09ll);
}
public LocationClientOptionBuilder setCoorType(CoorType coorType) {
this.option.setCoorType(coorType.name());
return this;
}
/**
* 連續(xù)定位
* 可選,設(shè)置發(fā)起定位請(qǐng)求的間隔,int類型,單位ms
* 如果設(shè)置為0,則代表單次定位,即僅定位一次,默認(rèn)為0
* 如果設(shè)置非0,需設(shè)置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();
//可選,設(shè)置定位模式,默認(rèn)高精度
//LocationMode.Hight_Accuracy:高精度;
//LocationMode. Battery_Saving:低功耗;
//LocationMode. Device_Sensors:僅使用設(shè)備;
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
//可選,設(shè)置返回經(jīng)緯度坐標(biāo)類型,默認(rèn)GCJ02
//GCJ02:國(guó)測(cè)局坐標(biāo);
//BD09ll:百度經(jīng)緯度坐標(biāo);
//BD09:百度墨卡托坐標(biāo);
//海外地區(qū)定位,無需設(shè)置坐標(biāo)類型,統(tǒng)一返回WGS84類型坐標(biāo)
// option.setCoorType("bd09ll");
//可選,設(shè)置發(fā)起定位請(qǐng)求的間隔,int類型,單位ms
//如果設(shè)置為0,則代表單次定位,即僅定位一次,默認(rèn)為0
//如果設(shè)置非0,需設(shè)置1000ms以上才有效
// option.setScanSpan(1000);
//可選,設(shè)置是否使用gps,默認(rèn)false
//使用高精度和僅用設(shè)備兩種定位模式的,參數(shù)必須設(shè)置為true
option.setOpenGps(true);
//可選,設(shè)置是否當(dāng)GPS有效時(shí)按照1S/1次頻率輸出GPS結(jié)果,默認(rèn)false
// option.setLocationNotify(true);
//可選,定位SDK內(nèi)部是一個(gè)service,并放到進(jìn)程。
// option.setIgnoreKillProcess(true);
//可選,設(shè)置是否收集Crash信息,默認(rèn)收集,即參數(shù)為false
// option.SetIgnoreCacheException(false);
//可選,V7.2版本新增能力
//如果設(shè)置了該接口,首次啟動(dòng)定位時(shí),會(huì)先判斷當(dāng)前Wi-Fi是否超出有效期,若超出有效期,會(huì)先重新掃描Wi-Fi,然后定位
// option.setWifiCacheTimeOut(5 * 60 * 1000);
//可選,設(shè)置是否需要過濾GPS結(jié)果,默認(rèn)需要,即參數(shù)為false
// option.setEnableSimulateGps(false);
return option;
}
/**
* 坐標(biāo)系
*/
public enum CoorType {
gcj02,
bd09,
bd09ll
}
}
2、構(gòu)建定位的工具類
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;
}
/**
* 地圖定位結(jié)果
*/
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);
}
}
/**
* 回調(diào)類
*/
public abstract static class LocationCallBack {
/**
* 定位的結(jié)果
*
* @param statusCode 狀態(tài)碼,1:定位成功,-1定位失敗
* @param bdLocation 定位成功時(shí)返回的定位結(jié)果對(duì)象
* @param errMsg 定位失敗時(shí)的錯(cuò)誤信息,成功時(shí)則為null
*/
public abstract void onReceiveLocation(int statusCode, BDLocation bdLocation, String errMsg);
/**
* 錯(cuò)誤的狀態(tài)碼
* <a>http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/addition-func/error-code</a>
* <p>
* 回調(diào)定位診斷信息,開發(fā)者可以根據(jù)相關(guān)信息解決定位遇到的一些問題
*
* @param locType 當(dāng)前定位類型
* @param diagnosticType 診斷類型(1~9)
* @param diagnosticMessage 具體的診斷信息釋義
*/
public void onLocDiagnosticMessage(int locType, int diagnosticType, String diagnosticMessage) {
}
}
/**
* 錯(cuò)誤的狀態(tài)碼
* <a>http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/addition-func/error-code</a>
*
* @param locType 當(dāng)前定位類型
* @return String 定位成功或失敗的信息
*/
private String getLocationResultMsg(int locType) {
switch (locType) {
case 61:
return "GPS定位結(jié)果,GPS定位成功";
case 62:
return "無法獲取有效定位依據(jù),定位失敗,請(qǐng)檢查運(yùn)營(yíng)商網(wǎng)絡(luò)或者WiFi網(wǎng)絡(luò)是否正常開啟,嘗試重新請(qǐng)求定位";
case 63:
return "網(wǎng)絡(luò)異常,沒有成功向服務(wù)器發(fā)起請(qǐng)求,請(qǐng)確認(rèn)當(dāng)前測(cè)試手機(jī)網(wǎng)絡(luò)是否通暢,嘗試重新請(qǐng)求定位";
case 66:
return "離線定位結(jié)果。通過requestOfflineLocaiton調(diào)用時(shí)對(duì)應(yīng)的返回結(jié)果";
case 67:
return "離線定位失敗";
case 161:
return "網(wǎng)絡(luò)定位結(jié)果,網(wǎng)絡(luò)定位成功";
case 162:
return "請(qǐng)求串密文解析失敗,一般是由于客戶端SO文件加載失敗造成,請(qǐng)嚴(yán)格參照開發(fā)指南或demo開發(fā),放入對(duì)應(yīng)SO文件";
case 167:
return "服務(wù)端定位失敗,請(qǐng)您檢查是否禁用獲取位置信息權(quán)限,嘗試重新請(qǐng)求定位";
case 505:
return "AK不存在或者非法,請(qǐng)按照說明文檔重新申請(qǐng)AK";
default:
return "";
}
}
/**
* @param locType 當(dāng)前定位類型
* @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ù),請(qǐng)檢查運(yùn)營(yíng)商網(wǎng)絡(luò)或者Wi-Fi網(wǎng)絡(luò)是否正常開啟,嘗試重新請(qǐng)求定位";
case 6:
return "定位失敗,無法獲取有效定位依據(jù),請(qǐng)嘗試插一張sim卡或打開Wi-Fi重試";
case 7:
return "定位失敗,飛行模式下無法獲取有效定位依據(jù),請(qǐng)關(guān)閉飛行模式重試";
case 9:
return "定位失敗,無法獲取任何有效定位依據(jù)";
}
case 67:
if (diagnosticType == 3) return "定位失敗,請(qǐng)您檢查您的網(wǎng)絡(luò)狀態(tài)";
case 161:
switch (diagnosticType) {
case 1:
return "定位失敗,建議您打開GPS";
case 2:
return "定位失敗,建議您打開Wi-Fi";
}
case 167:
if (diagnosticType == 8) return "定位失敗,請(qǐng)確認(rèn)您定位的開關(guān)打開狀態(tài),是否賦予APP定位權(quán)限";
default:
return "未知錯(cuò)誤";
}
}
}3、顯示用戶當(dāng)前位置到地圖的工具類
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;
/**
* 顯示用戶當(dāng)前位置到地圖上
*
* @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);
}
/**
* 在地圖上顯示用戶的當(dāng)前位置
*/
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())
// 此處設(shè)置開發(fā)者獲取到的方向信息,順時(shí)針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) //設(shè)置中心點(diǎn)
.zoom(18f)//設(shè)置縮放級(jí)別
.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;
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android開發(fā)中使用顏色矩陣改變圖片顏色,透明度及亮度的方法
這篇文章主要介紹了Android開發(fā)中使用顏色矩陣改變圖片顏色,透明度及亮度的方法,涉及Android針對(duì)圖片的讀取、運(yùn)算、設(shè)置等相關(guān)操作技巧,需要的朋友可以參考下2017-10-10
Android編程布局控件之AbsoluteLayout用法實(shí)例分析
這篇文章主要介紹了Android編程布局控件之AbsoluteLayout用法,結(jié)合實(shí)例形式簡(jiǎn)單分析了Android絕對(duì)布局AbsoluteLayout的使用技巧,需要的朋友可以參考下2015-12-12
Android編程之ListPreference用法實(shí)例分析
這篇文章主要介紹了Android編程之ListPreference用法,結(jié)合實(shí)例形式較為詳細(xì)的分析說明了ListPreference的功能、用法及相關(guān)注意事項(xiàng),需要的朋友可以參考下2015-12-12
Android?Java?try?catch?失效問題及解決
這篇文章主要介紹了Android?Java?try?catch?失效問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
詳解Recyclerview item中有EditText使用刷新遇到的坑
這篇文章主要介紹了詳解Recyclerview item中有EditText使用刷新遇到的坑,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05

