连续定位

连续定位是指发起一次定位请求后位置服务将按照按用户指定周期,周期性的返回定位结果的一种定位方式。这种定位方式是最常见的一种定位方式。

注意点:自定位7.2.8开始需要上传设备唯一标识,用于在定位发生问题查询问题原因,通过TencentLocationManager.setDeviceID上传。


1、获取TencentLocationManager实例

获取实例如下所示,首次获取实例会做初始化操作,可能会有耗时,因此可以尽可能提前初始化时机。

mLocationManager = TencentLocationManager.getInstance(this);

其中this是Context。由于TencentLocationManager是单例,为避免出现内存泄漏,建议用户使用ApplicationContext作为参数。


2、创建位置监听器

TencentLocationListener 接口代表位置监听器,您的APP 通过位置监听器接收定位SDK的位置变化通知。创建位置监听器非常简单,通常您只需实现 TencentLocationListener 接口。如下所示:

public class MyActivity extends Activity implements TencentLocationListener {
    ...
  
    @Override
    public void onLocationChanged(TencentLocation location, int error, String reason) {
    /**
     * location - 新的位置, *可能*来自缓存. 定位失败时 location 无效或者为 null
     * error - 错误码, 仅当错误码为 TencentLocation.ERROR_OK 时表示定位成功, 为其他值时表示定位失败
     * reason - 错误描述, 简要描述错误原因
     */
    }
  
    @Override
    public void onStatusUpdate(String name, int status, String desc) {
    /**
     * name - 设备名, GPS, WIFI, CELL 中的某个
     * status - 状态码, STATUS_ENABLED, STATUS_DISABLED, STATUS_UNKNOWN, STATUS_GPS_AVAILABLE, STATUS_GPS_UNAVAILABLE, STATUS_DENIED中的某个 在使用status之前,请先按照name进行区分
     * desc - 状态描述
     */
    }          
}

其中onLocationChanged用于接收定位结果,onStatusUpdate用于接收GPS、WiFi、Cell状态码,其中状态码具体参数含义可以参考状态码对照表


3、构造TencentLocationRequest

TencentLocationRequest 类代表定位请求, 您的APP通过向定位SDK发送定位请求来启动定位。通常您只需获取 TencentLocationRequest 实例即可,如下所示:

TencentLocationRequest request = TencentLocationRequest.create()

以上得到的是一个缺省的定位请求,缺省的定位请求各参数如下:

定位周期(位置监听器回调周期):5秒

Request Level:REQUEST_LEVEL_ADMIN_AREA

是否允许GPS:true

是否需要获取传感器方向:false

是否需要开启室内定位:false

定位模式: 高精度定位模式

gps优先: 默认为非gps优先

gps优先等待时间: 默认等待5s

设备方向: 不允许获取设备方向


TencentLocationRequest主要方法说明:

//用户可以自定义定位间隔,时间单位为毫秒,不得小于1000毫秒:
request.setInterval(10000);

根据用户获取的位置信息的详细程度,可以选择不同的RequestLevel,具体不同的RequestLevel含义可以参考RequestLevel说明

//设置请求级别
request.setRequestLevel(TencentLocationRequest.REQUEST_LEVEL_ADMIN_AREA);

建议用户开启,在室外场景可以显著提升定位精度。

//是否允许使用GPS
request.setAllowGPS(true)

一旦设置为true,在回调的TencentLocation里面通过getDirection()就可以获取当前设备方向了。值得一提的是TencentLocation里面还有一个getBearing()方法,该方法返回的方向是GPS返回的方向信息,因此在没有GPS信号的时候getBearing()方法获取不到方向信息。如果用户对方向有明确要求的前提下可以选择开启获取传感器方向,但是缺点可能是比较耗电。

//是否需要获取传感器方向
request.setAllowDirection(true)

一旦设置为true,内部将启动适配室内定位的策略。如果用户App定位场景室内较多时建议开启。可以提升室内定位准确率。

//是否需要开启室内定位
request.setIndoorLocationMode(true)

设置定位模式,定位模式包括HIGH_ACCURACY_MODE,ONLY_NETWORK_MODE 和 ONLY_GPS_MODE,通过TencentLocationRequest获取:

  • HIGH_ACCURACY_MODE:高精度定位模式,将同时使用网络定位和卫星定位,优先返回精度高的定位

  • ONLY_NETWORK_MODE:仅网络定位模式,将不启动gps定位,只使用网络定位,可以减少耗电量,但定位精度有所降低

  • ONLY_GPS_MODE:仅GPS定位模式,将只返回GPS定位结果,在室外可提升定位精度(约3~10米),GPS首次获取位置较慢且耗电较高(请求定位未获得GPS结果或GPS丢失后,如果超时时间内无GPS结果,则返回网络定位结果,超时时间为8s)

// 设置定位模式
int locMode = TencentLocationRequest.HIGH_ACCURACY_MODE;
request.setLocMode(locMode);

设置Gps优先,一旦设置为true,首次定位将等待卫星定位结果,超时时间默认为5s,超时时间后仍无卫星定位结果将返回网络定位结果。

注:只有高精度定位模式下可以使用此设置

// 设置GPS优先
request.setGpsFirst(true);
// 用户可定义GPS超时时间,超过该时间仍然没有卫星定位结果将返回网络定位结果
request.setGpsTimeOut(5*1000);

4、发起连续定位请求

mLocationManager.requestLocationUpdates(request,this);

或者可以由用户自行决定定位结果回调线程

mLocationManager.requestLocationUpdates(request,this,Looper.getMainLooper());

this代表了TencentLocationListener的实现类

定位返回结果错误码请参考错误码对照表


5、停止定位

mLocationManager.removeUpdates(this);

this代表了TencentLocationListener的实现类


6、注意

定位区分线程吗?

  • 定位不区分线程,建议在子线程调用,减少anr

这篇文章对您解决问题是否有帮助?

已解决
未解决