Android中怎么接入百度地图定位

这篇文章将为大家详细讲解有关Android中怎么接入百度地图定位,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

1、构建定位Option的工具类

Android中怎么接入百度地图定位

importcom.baidu.location.LocationClientOption;


publicclassLocationClientOptionBuilder{
privateLocationClientOptionoption;

publicstaticLocationClientOptionBuilderbuilder(){
LocationClientOptionBuilderbuilder=newLocationClientOptionBuilder();
builder.option=builder.initOption();
returnbuilder;
}

/**
*设置坐标系
*
*@return
*@seeCoorType
*/
publicLocationClientOptionBuildersetCoorType(){
returnsetCoorType(CoorType.bd09ll);
}

publicLocationClientOptionBuildersetCoorType(CoorTypecoorType){
this.option.setCoorType(coorType.name());
returnthis;
}

/**
*连续定位
*可选,设置发起定位请求的间隔,int类型,单位ms
*如果设置为0,则代表单次定位,即仅定位一次,默认为0
*如果设置非0,需设置1000ms以上才有效
*
*@paramtime
*@return
*/
publicLocationClientOptionBuildersetScanSpan(inttime){
this.option.setScanSpan(time);
returnthis;
}

publicLocationClientOptionbulid(){
returnthis.option;
}

privateLocationClientOptioninitOption(){
LocationClientOptionoption=newLocationClientOption();
//可选,设置定位模式,默认高精度
//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);
returnoption;
}

/**
*坐标系
*/
publicenumCoorType{
gcj02,
bd09,
bd09ll
}
}

2、构建定位的工具类

importandroid.content.Context;
importandroid.support.annotation.NonNull;
importandroid.util.Log;

importcom.baidu.location.BDAbstractLocationListener;
importcom.baidu.location.BDLocation;
importcom.baidu.location.LocationClient;
importcom.baidu.location.LocationClientOption;

/**
*百度地图定位工具类
*
*@authorpeter2018-12-2110:12
*/
publicclassBMapLocationHelper{

privatestaticfinalintLOCATION_SUCCESS=1;
staticfinalintLOCATION_FAIL=-1;
privateLocationClientmLocationClient;
privateMyLocationListenermyListener=newMyLocationListener();
privateLocationCallBackcallBack;


privateBMapLocationHelper(LocationCallBackcallBack){

this.callBack=callBack;
}

publicstaticBMapLocationHelpercreate(@NonNullContextcontext,@NonNullLocationClientOptionoption,@NonNullLocationCallBackcallBack){
BMapLocationHelperbMapLocationHelper=newBMapLocationHelper(callBack);
LocationClientclient=newLocationClient(context);
client.setLocOption(option);
//声明LocationClient类
client.registerLocationListener(bMapLocationHelper.myListener);
bMapLocationHelper.mLocationClient=client;
returnbMapLocationHelper;
}

/**
*开始定位
*/
publicvoidlocStart(){
mLocationClient.start();
}

/**
*停止定位
*/
publicvoidlocStop(){
mLocationClient.stop();
}

publicvoidlocReStart(){
mLocationClient.restart();
}

publicLocationClientgetmLocationClient(){
returnmLocationClient;
}

/**
*地图定位结果监听类
*/
publicclassMyLocationListenerextendsBDAbstractLocationListener{
privatestaticfinalStringTAG="MyLocationListener";

@Override
publicvoidonReceiveLocation(BDLocationlocation){
if(location==null)return;
intlocType=location.getLocType();
intstatus=LOCATION_SUCCESS;
if(locType!=61&&locType!=161&&locType!=66)status=LOCATION_FAIL;
StringerrMsg=getLocationResultMsg(locType);
callBack.onReceiveLocation(status,location,errMsg);
}

@Override
publicvoidonLocDiagnosticMessage(inti,inti1,Strings){
Log.i(TAG,"onLocDiagnosticMessage:"+i+"diaType:"+i1);
callBack.onLocDiagnosticMessage(i,i1,getLocDiagnosticMessage(i,i1));
super.onLocDiagnosticMessage(i,i1,s);
}
}


/**
*回调类
*/
publicabstractstaticclassLocationCallBack{

/**
*定位的结果
*
*@paramstatusCode状态码,1:定位成功,-1定位失败
*@parambdLocation定位成功时返回的定位结果对象
*@paramerrMsg定位失败时的错误信息,成功时则为null
*/
publicabstractvoidonReceiveLocation(intstatusCode,BDLocationbdLocation,StringerrMsg);

/**
*错误的状态码
*<a>http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/addition-func/error-code</a>
*<p>
*回调定位诊断信息,开发者可以根据相关信息解决定位遇到的一些问题
*
*@paramlocType当前定位类型
*@paramdiagnosticType诊断类型(1~9)
*@paramdiagnosticMessage具体的诊断信息释义
*/
publicvoidonLocDiagnosticMessage(intlocType,intdiagnosticType,StringdiagnosticMessage){
}
}

/**
*错误的状态码
*<a>http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/addition-func/error-code</a>
*
*@paramlocType当前定位类型
*@returnString定位成功或失败的信息
*/
privateStringgetLocationResultMsg(intlocType){
switch(locType){
case61:
return"GPS定位结果,GPS定位成功";
case62:
return"无法获取有效定位依据,定位失败,请检查运营商网络或者WiFi网络是否正常开启,尝试重新请求定位";
case63:
return"网络异常,没有成功向服务器发起请求,请确认当前测试手机网络是否通畅,尝试重新请求定位";
case66:
return"离线定位结果。通过requestOfflineLocaiton调用时对应的返回结果";
case67:
return"离线定位失败";
case161:
return"网络定位结果,网络定位成功";
case162:
return"请求串密文解析失败,一般是由于客户端SO文件加载失败造成,请严格参照开发指南或demo开发,放入对应SO文件";
case167:
return"服务端定位失败,请您检查是否禁用获取位置信息权限,尝试重新请求定位";
case505:
return"AK不存在或者非法,请按照说明文档重新申请AK";
default:
return"";
}
}

/**
*@paramlocType当前定位类型
*@paramdiagnosticType诊断类型(1~9)
*@returnString
*/
privateStringgetLocDiagnosticMessage(intlocType,intdiagnosticType){

switch(locType){
case62:
switch(diagnosticType){
case4:
return"定位失败,无法获取任何有效定位依据";
case5:
return"定位失败,无法获取有效定位依据,请检查运营商网络或者Wi-Fi网络是否正常开启,尝试重新请求定位";
case6:
return"定位失败,无法获取有效定位依据,请尝试插入一张sim卡或打开Wi-Fi重试";
case7:
return"定位失败,飞行模式下无法获取有效定位依据,请关闭飞行模式重试";
case9:
return"定位失败,无法获取任何有效定位依据";
}
case67:
if(diagnosticType==3)return"定位失败,请您检查您的网络状态";

case161:
switch(diagnosticType){
case1:
return"定位失败,建议您打开GPS";
case2:
return"定位失败,建议您打开Wi-Fi";
}
case167:
if(diagnosticType==8)return"定位失败,请确认您定位的开关打开状态,是否赋予APP定位权限";

default:
return"未知错误";
}
}
}

3、显示用户当前位置到地图的工具类

importandroid.content.Context;
importandroid.support.annotation.NonNull;
importandroid.util.Log;

importcom.baidu.location.BDLocation;
importcom.baidu.location.LocationClientOption;
importcom.baidu.mapapi.map.BaiduMap;
importcom.baidu.mapapi.map.MapStatus;
importcom.baidu.mapapi.map.MapStatusUpdateFactory;
importcom.baidu.mapapi.map.MyLocationData;
importcom.baidu.mapapi.model.LatLng;
importcom.yikesong.sender.util.ToastUtils;

/**
*显示用户当前位置到地图上
*
*@authorpeter2018-12-2116:27
*/
publicclassUserLocationextendsBMapLocationHelper.LocationCallBack{
privateContextcontext;
privatebooleanisFirstLoc=true;
privateBaiduMapmap;
privateintmCurrentDirection=0;
privateBMapLocationHelperhelper;
privatestaticfinalStringTAG="UserLocation";

publicUserLocation(@NonNullContextcontext,@NonNullBaiduMapmap){
this.context=context;
this.map=map;
init();
}

privatevoidinit(){
map.setMapType(BaiduMap.MAP_TYPE_NORMAL);
//开启定位图层
map.setMyLocationEnabled(true);
}

/**
*在地图上显示用户的当前位置
*/
publicvoidshowUserLocationOnMap(){
if(helper==null){
LocationClientOptionoption=LocationClientOptionBuilder
.builder()
.setCoorType()
.bulid();
helper=BMapLocationHelper.create(this.context,option,this);
}
helper.locStart();
}

@Override
publicvoidonReceiveLocation(intstatusCode,BDLocationbdLocation,StringerrMsg){
if(statusCode==BMapLocationHelper.LOCATION_FAIL){
ToastUtils.toastInfo(errMsg,context);
Log.i(TAG,"onReceiveLocation:"+errMsg);
return;
}
MyLocationDatalocData=newMyLocationData.Builder()
.accuracy(bdLocation.getRadius())
//此处设置开发者获取到的方向信息,顺时针0-360
.direction(mCurrentDirection).latitude(bdLocation.getLatitude())
.longitude(bdLocation.getLongitude()).build();
map.setMyLocationData(locData);
if(isFirstLoc){
isFirstLoc=false;
LatLngcenterPoint=newLatLng(bdLocation.getLatitude(),
bdLocation.getLongitude());
MapStatusmapStatus=newMapStatus.Builder()
.target(centerPoint)//设置中心点
.zoom(18f)//设置缩放级别
.build();
map.animateMapStatus(MapStatusUpdateFactory.newMapStatus(mapStatus));
}
if(helper!=null)helper.locStop();
}

@Override
publicvoidonLocDiagnosticMessage(intlocType,intdiagnosticType,StringdiagnosticMessage){
super.onLocDiagnosticMessage(locType,diagnosticType,diagnosticMessage);
}

publicBMapLocationHelpergetHelper(){
returnhelper;
}

publicBaiduMapgetMap(){
returnmap;
}

publicintgetmCurrentDirection(){
returnmCurrentDirection;
}
}

关于Android中怎么接入百度地图定位就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

发布于 2021-06-13 23:19:07
收藏
分享
海报
0 条评论
169
上一篇:java中如何实现对象的序列化和反序列化 下一篇:微信小程序中基础入门的示例分析
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码