连续定位
连续定位是指发起一次定位请求后位置服务将按照按用户指定周期,周期性的返回定位结果的一种定位方式。这种定位方式是最常见的一种定位方式。
注意点:自定位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