Android百度地图定位、显示用户当前位置
作者:miskss 发布时间:2021-08-20 04:47:05
标签: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?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
0
投稿
猜你喜欢
- EntityWrapper使用解析1、项目中引入jar包,我这里使用Maven构建<dependency> &nbs
- 本文实例展示了C#利用反射来判断对象是否包含某个属性的实现方法,对于C#程序设计人员来说有一定的学习借鉴价值。具体实现代码如下:/// &l
- 本文实现了C#隐式运行CMD命令的功能。下图是实例程序的主画面。在命令文本框输入DOS命令,点击“Run”按钮,在下面的文本框中输出运行结果
- 前言上一篇 文章我们完成了在 thymeleaf 模板引擎中使用 shiro 标签,也就是根据不同的用户身份信息,前端页面来显示不同的页面内
- 前言环境: flutter sdk v1.7.8+hotfix.3@stable对应 flutter engine: 54ad777f这里关
- 效果展示人脸支付效果视频密码框输入支付效果视频因为密码支付时会调起系统安全键盘,开启自动保护功能,防止泄露,会导致输入密码时录屏黑屏,故使用
- 前言spring框架作为JavaEE框架领域的一款重要的开源框架,在企业应用开发中有着很重要的作用,同时Spring框架及其子框架很多,所以
- 归并排序简单解释:该算法是采用分治法,把数组不断分割,直至成为单个元素,然后比较再合并(合并的过程就是两部分分别从头开始比较,取出最小或最大
- 重复参数 Scala在定义函数时允许指定最后一个参数可以重复(变长参数),从而允许函数调用者使用变长参数列表来调用该函数,Scala中使用“
- Kotlin JSON解析开发环境就是下面这个…一、添加依赖在build.gradle.kts文件中添加下面依赖。de
- 文档合并是一种高效文档处理方式。如果能够有一个方法能将多种不同类型的文档合并成一种文档格式,那么在文档存储管理上将为我们提供极大的便利。因此
- webservice的应用已经越来越广泛了,下面介绍几种在Java体系中开发webservice的方式,相当于做个记录。1.Axis2Axi
- 在上一篇里已经向大家介绍了如何使用GDI+绘制简单的图像,这一片继续向大家介绍其它一些绘图知识.1.首先我们来看下上一片中我们使用过的Pen
- TaskAwaiter先说一下 TaskAwaiter,TaskAwaiter 表示等待异步任务完成的对象并为结果提供参
- 本文实例讲述了Java链表中元素删除的实现方法。分享给大家供大家参考,具体如下:该部分与上一节是息息相关的,关于如何在链表中删除元素,我们一
- 前言在项目开发中,日志系统是必不可少的,用AOP在Web的请求做入参和出参的参数打印,同时对异常进行日志打印,避免重复的手写日志,完整案例见
- 本文实例讲述了Android编程获取网络时间的方法。分享给大家供大家参考,具体如下:在网上看到的最常见的方式有:public static
- 前几天,公司数据库出现了两条相同的数据,而且时间相同(毫秒也相同)。排查原因,发现是网络波动造成了重复提交。由于网络波动而重复提交的例子也比
- 在Android系统上开发游戏是Android开发学习者所向往的,有成就感也有乐趣,还能取得经济上的报酬。那怎样开发Androi
- yaml介绍YAML(YAML Ain't Markup Language),一种数据序列化格式优点:容易阅读容易与脚本语言交互以数