使用
创建位置监听器
TencentLocationListener 接口代表位置监听器,您的 App 通过位置监听器接收定位 SDK 的位置变化通知。创建位置监听器非常简单,通常您只需实现 TencentLocationListener 接口。如下所示:
public class MyActivity extends Activity implements TencentLocationListener {
...
@Override
public void onLocationChanged(TencentLocation location, int error, String reason) {
// do your work
}
@Override
public void onStatusUpdate(String name, int status, String desc) {
// do your work
}
}
位置监听器的回调方法分为两类:一类是位置更新时的回调,一类是 GPS 和 Wi-Fi 的状态变化回调。
- 位置回调接口如下:
public void onLocationChanged(TencentLocation location, int error, String reason)
参数 | 含义 |
---|---|
location | 新的位置 |
error | 错误码 |
reason | 错误描述 |
- 状态回调接口如下:
public void onStatusUpdate(String name, int status, String desc)
参数 | 含义 |
---|---|
name | GPS, Wi-Fi 等 |
status | 新的状态,启用或禁用 |
desc | 状态描述 |
在 Android 6.0 及以上的系统版本中,当位置开关关闭时,onStatusUpdate 接口会返回 name=wifi,status=5,该状态码说明位置开关关闭,此时无法进行 Wi-Fi 扫描。收到该状态码后,请及时提醒用户打开位置开关。
状态码即 TencentLocationListener的onStatusUpdate 回调的 status 字段返回的。
Name | |||
---|---|---|---|
状态 | 状态码 | 说明 | |
cell | STATUS_DISABLED | 0 | 模块关闭 |
STATUS_EABLED | 1 | 模块开启 | |
STATUS_DENIED | 2 | 定位权限被禁止,位置权限被拒绝通常发生在禁用当前应用的 ACCESS_COARSE_LOCATION 等定位权限 | |
wifi | STATUS_DISABLED | 0 | Wi-Fi 开关关闭 |
STATUS_EABLED | 1 | Wi-Fi 开关打开 | |
STATUS_DENIED | 2 | 权限被禁止,禁用当前应用的 ACCESS_COARSE_LOCATION 等定位权限 | |
STATUS_LOCATION_SWITCH_OFF | 5 | 位置信息开关关闭,在 Android M 系统中,此时禁止进行 Wi-Fi 扫描 | |
GPS | STATUS_DISABLED | 0 | GPS 开关关闭 |
STATUS_EABLED | 1 | GPS 开关打开 | |
STATUS_GPS_AVAILABEL | 3 | GPS 可用,代表 GPS 开关打开,且搜星定位成功 | |
STATUS_GPS_UNAVAILABLE | 4 | GPS 不可用,不可用有多种可能,比如: GPS 开关被关闭,GPS 开关开着但是没办法搜星或者在室内等定位不成功的情况 |
创建定位请求
TencentLocationRequest 类代表定位请求, 您的 App 通过向定位 SDK 发送定位请求来启动定位。通常您只需获取 TencentLocationRequest 实例即可,如下所示:
TencentLocationRequest request = TencentLocationRequest.create();
以上得到的是一个缺省的定位请求,缺省的定位请求各参数如下:
定位周期(位置监听器回调周期): 10秒
Request Level: REQUEST_LEVEL_NAME
缓存: 允许使用缓存
QQ: 空字符串
手机号:空字符串
传感器:默认不使用
GPS:允许使用缓存
室内定位:默认不使用
可调用如下方法来对定位请求进行自定义配置:
方法名 | 功能 |
---|---|
setInterval | 设置定位周期(位置监听器回调周期), 单位为 ms(毫秒) |
setRequestLevel | 设置定位的 request level |
setQQ | 设置 QQ 号 |
setPhoneNumber | 设置电话号 |
setAllowDirection | 设置是否允许使用设备传感器获取方向 |
setAllowGPS | 设置是否允许使用 GPS 进行定位,默认允许 |
setIndoorLocationMode | 设置启动室内定位 |
Request level 决定定位结果中包含哪些信息,分为以下几类:
Request Level | 值 | 含义 |
---|---|---|
REQ_LEVEL_GEO | 0 | 包含经纬度 |
REQ_LEVEL_NAME | 1 | 包含经纬度, 位置名称, 位置地址 |
REQ_LEVEL_ADMIN_AREA | 3 | 包含经纬度,位置所处的中国大陆行政区划 |
REQ_LEVEL_POI | 4 | 包含经纬度,位置所处的中国大陆行政区划及周边 POI 列表 |
注册位置监听器
TencentLocationManager 类代表腾讯定位服务。注册位置监听器前需要获取 TencentLocationManager 实例,示例如下
Context context = ...
TencentLocationListener listener = ...
TencentLocationRequest request = ...
TencentLocationManager locationManager = TencentLocationManager.getInstance(context);
int error = locationManager.requestLocationUpdates(request, listener);
- 返回值为0时,表示位置监听器注册成功。注册成功之后,在位置发生变化时,位置监听器的位置回调接口或状态回调接口将会被调用,用以接收最新的位置或状态。
- 返回值非0时,表示位置监听器注册失败。注册监听器失败时,将无法接收到位置更新,继续使用腾讯地图定位SDK前您应先排查注册失败的问题。常见的返回值如下:
返回值 | 含义 |
---|---|
0 | 注册位置监听器成功 |
1 | 设备缺少使用腾讯定位 SDK 需要的基本条件 |
2 | 配置的 Key 不正确 |
3 | 自动加载 libtencentloc.so 失败,可能由以下原因造成: 1、这往往是由工程中的so与设备不兼容造成的,组件包只包含了 armeabi 的 so,请前往腾讯位置服务官网下载并添加相应版本 so 文件。 2、如果您使用 AndroidStudio,可能是 gradle 没有正确指向,so 文件加载位置,并配置您的 gradle。 |
获取定位结果
通过位置监听器的位置回调接口获取定位结果。使用定位结果前应当先检查错误码:
@Override
public void onLocationChanged(TencentLocation location, int error, String reason) {
if (TencentLocation.ERROR_OK == error) {
// 定位成功
} else {
// 定位失败
}
}
错误码说明
错误码来自 TencentLocation 的 ERROR_XXX 常量,分如下几种情形:
错误码 | 值 | 含义 |
---|---|---|
ERROR_OK | 0 | 定位成功 |
ERROR_NETWORK | 1 | 网络问题引起的定位失败 |
ERROR_BAD_JSON | 2 | GPS,Wi-Fi 或基站错误引起的定位失败: 1、用户的手机确实采集不到定位凭据,比如偏远地区比如地下车库电梯内等; 2、开关跟权限问题,比如用户关闭了位置信息,关闭了 Wi-Fi,未授予 App 定位权限等。 |
ERROR_WGS84 | 4 | 无法将 WGS84 坐标转换成 GCJ-02 坐标时的定位失败 |
ERROR_UNKNOWN | 404 | 未知原因引起的定位失败 |
request level 说明
request level 来自 TencentLocationRequest 的 REQUEST_LEVEL_XXX 常量,分如下几种情形:
Request Level | 值 | 含义 |
---|---|---|
REQ_LEVEL_GEO | 0 | 包含经纬度 |
REQ_LEVEL_NAME | 1 | 包含经纬度, 位置名称, 位置地址 |
REQ_LEVEL_ADMIN_AREA | 3 | 包含经纬度,位置所处的中国大陆行政区划 |
REQ_LEVEL_POI | 4 | 包含经纬度,位置所处的中国大陆行政区划及周边 POI 列表 |
- 当定位请求的 request level 为 REQ_LEVEL_GEO 时,以下字段有效:
字段 | 含义 |
---|---|
latitude | 纬度 |
longitude | 经度 |
altitude | 海拔 |
accuracy | 精度 |
- 当定位请求的 request level 为 REQ_LEVEL_NAME 时,以下字段有效:
字段 | 含义 |
---|---|
latitude | 纬度 |
longitude | 经度 |
altitude | 海拔 |
accuracy | 精度 |
name | 名称 |
address | 地址 |
- 当定位请求的 request level 为 REQ_LEVEL_ADMIN_AREA 时,以下字段有效:
字段 | 含义 |
---|---|
latitude | 纬度 |
longitude | 经度 |
altitude | 海拔 |
accuracy | 精度 |
nation | 国家 |
province | 省 |
city | 市 |
district | 区 |
town | 镇 |
village | 村 |
street | 街道 |
streetNo | 门号 |
- 当定位请求的 request level 为 REQ_LEVEL_POI 时,以下字段有效:
字段 | 含义 |
---|---|
latitude | 纬度 |
longitude | 经度 |
altitude | 海拔 |
accuracy | 精度 |
nation | 国家 |
province | 省 |
city | 市 |
district | 区 |
town | 镇 |
village | 村 |
street | 街道 |
streetNo | 门号 |
poiList | POI 列表 |
删除位置监听器
定位完成后,无论成功或失败,都应当尽快删除之前注册的位置监听器。代码如下:
Context context = ...
TencentLocationListener listener = ...
TencentLocationManager locationManager =
TencentLocationManager.getInstance(context);
locationManager.removeUpdates(listener);
Android 6.0 说明
Android 6.0 系统在原有的 AndroidManifest.xml 声明权限的基础上新增了运行时权限动态检测,定位等权限也包含在其中。如果您的应用程序设置了 targetSdkVersion ≥ 23,则需要在调用定位功能前进行权限检查,权限检查的示例代码如下:
if (Build.VERSION.SDK_INT >= 23) {
String[] permissions = {
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
if (checkSelfPermission(permissions[0]) != PackageManager.PERMISSION_GRANTED)
{
requestPermissions(permissions, 0);
}
}
用户选择允许或拒绝后,会回调 onRequestPermissionsResult 方法:
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
//可在此继续其他操作。
}