高德地图使用——定位功能

在上一次中我们说到了如何申请key值,和在Application中如何配置,以及将地图显示出来。如果没看过的朋友们可以看一下笔者上一篇文章:最新高德地图使用(SDK6.3.0版本)——申请key、显示地图。在这一篇中,我们将了解如何实现高德地图定位功能。

相比于上一篇来说,我感觉这一篇的内容应该不会那么多,因为实现定位的功能实在是太简单了,只是涉及到几个类而已。在看代码之前,我们先看一下实现定位需要涉及到的几个类吧:

AMapLocationClient类

这个类是定位服务类,我们通过这个类实现定位。AMapLocationClient类主要涉及到的工作有:

  • 启动、停止定位
  • 设置、移除监听器
  • 设置定位参数(AMapLocationClientOption类,之后会详细介绍这个类)

1.构造方法

public AMapLocationClient(Context var1)

AMapLocationClient类的构造方法传入一个上下文参数,我们最好通过getApplicationContext方法获取全局Context,或者自定义Application中添加全局Context来获取。

2.常用方法

限定符

返回值

方法名

解释

public

void

setLocationOptionAMapLocationClientOption option

设置定位参数

public

void

setLocationListenerAMapLocationListener listener

设置定位回调监听

public

void

unRegisterListenerAMapLocationListener listener

移除定位监听

public

void

startLocation()

开始定位

public

void

stopLocation()

停止定位

public

AMapLocation

getLastKnownLocation()

获取最后一次定位的位置信息

public

void

enableBackgroundLocationint NotificationIdNotification notification

开启后台定位功能

开启后会显示一个通知栏

public

void

disableBackgroundLocationboolean 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

setIntervallong interval

发起定位时间间隔

public

AMapLocationClientOption

setLocationCacheEnableboolean

是否使用缓存策略

默认true(如果为true,在多次定位是会使用缓存值,如果想连续获取位置就设为false

public

AMapLocationClientOption

setLocationModeAMapLocationMode

设置定位模式

public

AMapLocationClientOption

setLocationProtocolAMapLocationProtocol

设置网络协议

public

AMapLocationClientOption

setLocationPurposeAMapLocationPurpose

设置定位场景

public

AMapLocationClientOption

setNeedAddressboolean

设置设置返回地址信息

默认true

public

AMapLocationClientOption

setOnceLocationboolean

设置单次定位

默认false

public

AMapLocationClientOption

setOnceLocationLastestboolean

设置是否等待WIFI列表刷新

定位精度更高,但速度更慢

public

AMapLocationClientOption

setSensorEnableboolean

是否使用传感器

默认false

public

AMapLocationClientOption

setWifiScanboolean

是否允许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());
    }
}

然后效果就给大家打印日志了:


好了,今天的文章就到这里了,喜欢的朋友希望多多支持一下,你们的支持是笔者最大的动力!

猜你喜欢

转载自blog.csdn.net/zy_jibai/article/details/80764553