Android中怎么接入百度地图定位
作者
这篇文章将为大家详细讲解有关Android中怎么接入百度地图定位,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
1、构建定位Option的工具类
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中怎么接入百度地图定位就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
目录
推荐阅读
-
怎么使用Android基准配置文件Baseline Profile方案提升启动速度
-
HTML5如何实现禁止android视频另存为
-
学java好还是学php好?
-
Android如何实现多点触控功能
-
android怎么实现多点触摸应用
-
Android怎么实现手势划定区域裁剪图片
-
android怎么实现简单的矩形裁剪框
-
Android单选多选按钮怎么使用
-
Android中如何利用oncreate获取控件高度或宽度
Android中如何利用oncreate获取控件高度或宽度本篇内容...
-
Android中怎么使用onSaveInstanceState()方法
Android中怎么使用onSaveInstanceState()方法...
0 条评论
本站已关闭游客评论,请登录或者注册后再评论吧~