在上一次中我们说到了如何申请key值,和在Application中如何配置,以及将地图显示出来。如果没看过的朋友们可以看一下笔者上一篇文章:最新高德地图使用(SDK6.3.0版本)——申请key、显示地图。在这一篇中,我们将了解如何实现高德地图定位功能。
相比于上一篇来说,我感觉这一篇的内容应该不会那么多,因为实现定位的功能实在是太简单了,只是涉及到几个类而已。在看代码之前,我们先看一下实现定位需要涉及到的几个类吧:
AMapLocationClient类
这个类是定位服务类,我们通过这个类实现定位。AMapLocationClient类主要涉及到的工作有:
- 启动、停止定位
- 设置、移除监听器
- 设置定位参数(AMapLocationClientOption类,之后会详细介绍这个类)
1.构造方法
public AMapLocationClient(Context var1)
AMapLocationClient类的构造方法传入一个上下文参数,我们最好通过getApplicationContext方法获取全局Context,或者自定义Application中添加全局Context来获取。
2.常用方法
限定符 |
返回值 |
方法名 |
解释 |
public |
void |
setLocationOption(AMapLocationClientOption option) |
设置定位参数 |
public |
void |
setLocationListener(AMapLocationListener listener) |
设置定位回调监听 |
public |
void |
unRegisterListener(AMapLocationListener listener) |
移除定位监听 |
public |
void |
startLocation() |
开始定位 |
public |
void |
stopLocation() |
停止定位 |
public |
AMapLocation |
getLastKnownLocation() |
获取最后一次定位的位置信息 |
public |
void |
enableBackgroundLocation(int NotificationId,Notification notification) |
开启后台定位功能 (开启后会显示一个通知栏) |
public |
void |
disableBackgroundLocation(boolean removeNotification) |
关闭后台定位功能 |
主要的方法就是上述的几个,其实感觉也没什么好说的了,因为上面表格中已经说的很清楚了。
AMapLocationClientOption类
AMapLocationClientOption类用来进行定位方式的配置。主要工作有:
- 定位间隔设置
- 定位模式等设置
- 是否返回相关属性
1.构造方法
他的构造方法没什么好说的,默认构造方法。
2.嵌套类
AMapLocationClientOption类内部有三个枚举类型。分别是AMapLocationMode、AMapLocationProtocol、AMapLocationPurpose、GeoLanguage。来一起看一下吧:
AMapLocationMode:
public static enum AMapLocationMode { Battery_Saving, Device_Sensors, Hight_Accuracy; private AMapLocationMode() { } }
Battery_Saving
高精度定位模式:在这种定位模式下,将同时使用高德网络定位和GPS定位,优先返回精度高的定位
Device_Sensors
仅设备定位模式:在这种模式下,将只使用GPS定位。
Hight_Accuracy
高精度定位模式:在这种定位模式下,将同时使用高德网络定位和GPS定位,优先返回精度高的定位
AMapLocationProtocol:
public static enum AMapLocationProtocol { HTTP(0), HTTPS(1); private int a; private AMapLocationProtocol(int var3) { this.a = var3; } public final int getValue() { return this.a; } }
HTTP:在这种定位协议下,会使用http请求定位
HTTPS:在这种定位协议下,会使用https请求定位
AMapLocationPurpose:
public static enum AMapLocationPurpose { SignIn, Transport, Sport; private AMapLocationPurpose() { } }
Signin:签到场景 只进行一次定位返回最接近真实位置的定位结果(定位速度可能会延迟1-3s)
Sport:运动场景 高精度连续定位,适用于有户内外切换的场景,GPS和网络定位相互切换,GPS定位成功之后网络定位不再返回,GPS断开之后一段时间才会返回网络结果
Transport:出行场景 高精度连续定位,适用于有户内外切换的场景,GPS和网络定位相互切换,GPS定位成功之后网络定位不再返回,GPS断开之后一段时间才会返回网络结果
GeoLanguage:不是很重要,我们不说了-。+!
3.常用方法
限定符 |
返回值 |
方法名 |
解释 |
public |
AMapLocationClientOption |
setInterval(long interval) |
发起定位时间间隔 |
public |
AMapLocationClientOption |
setLocationCacheEnable(boolean) |
是否使用缓存策略 默认true(如果为true,在多次定位是会使用缓存值,如果想连续获取位置就设为false) |
public |
AMapLocationClientOption |
setLocationMode(AMapLocationMode) |
设置定位模式 |
public |
AMapLocationClientOption |
setLocationProtocol(AMapLocationProtocol) |
设置网络协议 |
public |
AMapLocationClientOption |
setLocationPurpose(AMapLocationPurpose) |
设置定位场景 |
public |
AMapLocationClientOption |
setNeedAddress(boolean) |
设置设置返回地址信息 默认true |
public |
AMapLocationClientOption |
setOnceLocation(boolean) |
设置单次定位 默认false |
public |
AMapLocationClientOption |
setOnceLocationLastest(boolean) |
设置是否等待WIFI列表刷新 定位精度更高,但速度更慢 |
public |
AMapLocationClientOption |
setSensorEnable(boolean) |
是否使用传感器 默认false |
public |
AMapLocationClientOption |
setWifiScan(boolean) |
是否允许WIFI刷新 默认true |
AMapLocation类
AMapLocation类用于保存定位完成之后的位置信息(经纬度,地址等等。。。)
关于他的方法就不列举了,全都是setset。。。。。只要知道英文应该都能看懂的哈哈!
AMapLocationListener接口
这个就很明确了,只是一个回调接口,在定位位置改变时候进行回调的。他只有一个抽象方法:
public interface AMapLocationListener { void onLocationChanged(AMapLocation var1); }
接下来给大家带来一个例子:
Demo
public void startLocate() { AMapLocationClient mLocationClient = null; AMapLocationListener mLocationListener = this; mLocationClient = new AMapLocationClient(MyApplication.getSingleContext()); mLocationClient.setLocationListener(mLocationListener); AMapLocationClientOption mLocationClientOption = new AMapLocationClientOption(); mLocationClientOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy); mLocationClientOption.setOnceLocation(false); mLocationClientOption.setOnceLocationLatest(true); mLocationClientOption.setInterval(3000); mLocationClientOption.setSensorEnable(true); mLocationClientOption.setLocationCacheEnable(false);//生成本地缓存,不区分单次定位还是多次定位,默认true,如果想要连续获取位置就设置成false。 if (null != mLocationClient) { mLocationClient.setLocationOption(mLocationClientOption); //设置场景模式后最好调用一次stop,再调用start以保证场景模式生效 mLocationClient.stopLocation(); mLocationClient.startLocation(); NotificationCompat.Builder builder = new NotificationCompat.Builder(MyApplication.getSingleContext(),"1"); builder.setContentText("asd").setContentTitle("你好"); mLocationClient.enableBackgroundLocation(2,builder.build()); } view.startLocateResponse(mLocationClient); }
由于这个是被本人已经用MVP重构了的,所以只给大家展示涉及到定位的相关代码了。我们注意一下,AMapLocationListener设为了this,所以在本地一定重写了onLocationChanged方法:
@Override public void onLocationChanged(AMapLocation aMapLocation) { view.onLocationChangedResponse(aMapLocation); }
不要注意那么多细节,我们只需要知道在view的这个方法里面写的刷新定位的代码就好,我们点进去看一下:
@Override public void onLocationChangedResponse(AMapLocation aMapLocation) { if (aMapLocation.getErrorCode() == 0) { Log.e(TAG, "onLocationChanged: " + aMapLocation.getAddress() + "\n 经度:" + aMapLocation.getLongitude() + "\n 纬度:" + aMapLocation.getLatitude() + "\n 海拔: " + aMapLocation.getAltitude() + "\n 定位精度" + aMapLocation.getAccuracy()); //可在其中解析amapLocation获取相应内容。 } else { //定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。 Log.e("AmapError", "location Error, ErrCode:" + aMapLocation.getErrorCode() + ", errInfo:" + aMapLocation.getErrorInfo()); } }
然后效果就给大家打印日志了:
好了,今天的文章就到这里了,喜欢的朋友希望多多支持一下,你们的支持是笔者最大的动力!