0. 基础信息


为提高问题排查效率, 尽量提供以下基本信息

  • 线上用户的问题 还是 开发调试时遇到的问题
  • 项目的 targetSdkVersion
  • 定位 SDK 版本号
  • 设备: 手机 或 其他硬件(物联网设备, 手持设备等)
  • 设备信息: 手机厂商, 机型, 系统版本
  • 单次定位 还是 连续定位
  • TencentLocationRequest 的配置
  • 是单独的定位 SDK 问题, 还是导航 SDK 中的定位问题

获取本地日志方法

  • 复制代码并调用: TencentLocationManagerOptions.setDebuggable(true);
    • 需要再 TencentLocationManager 获取实例前调用
  • 在这里找到日志: /sdcard/Android/data/应用目录/files/t_log/
  • 1 小时日志大小大概为 3MB, 1 天 24 小时, 日志量大约为 70MB 左右
  • 本地日志建议在本地开发调试时开启, 线上时关闭

关于 DeviceID 和定位请求日志

调用 TencentLocationManager 中的 setDeviceID 方法, 传入一个 ID, 方便后面排查问题. 如果还未设置, 请现在开始, 设置一下

public void setDeviceID(Context context, String deviceID);

DeviceID 有 3 个注意点:

  • 该 ID 为任意字符串, 不会用来标记用户, 不会有隐私问题, 由开发者自行确定, 用来标记网络定位请求
  • DeviceID 需要每个用户都有一个, 请勿一个 App 所有用户共用一个 DeviceID
  • DeviceID 请勿设置过短, 否则查日志时容易查到其他用户的日志, 影响问题分析

关于本地日志和定位请求日志

  • 定位请求日志: 有设备发起定位时, 当时手机到的 WiFi, 基站, GPS 等状态信息, 多用来分析飘点和网络定位相关问题
  • 本地日志: 有详细的定位全流程的日志, 可用来分析: 报错, 异常的信息收集,

关于GNSS

全球导航卫星系统 (GNSS) 是一个总称: 主要包含 4 个系统, 即中国的北斗卫星导航系统(BDS或Beidou), 美国全球定位系统 (GPS), 俄罗斯格洛纳斯系统 (GLONASS) 以及欧盟伽利略系统 (Galileo).

由于GPS 是最早被广泛认知和应用的卫星导航系统, 大家常用 GPS 指代 GNSS. 但 GPS 本质只是 GNSS 的一种, 需要根据语境自行判断. SDK 是使用系统的 GNSS 接口, 请求的卫星定位结果, 系统会融合手机可用的导航卫星系统的信息, 给出一个综合的 GNSS 定位点.

关于定位原理

简述一下定位的原理: 开启定位后, SDK 会收集手机连接的 WiFi 信息, 周围 WiFi 列表信息, 周围基站信息等, 将他们发送给腾讯后台定位服务, 获取网络定位点和省市区等信息(由 RequestLevel 决定)

开启定位后, 也会获取通过系统的 GNSS 接口获取 GNSS 定位点

最后, 将网络定位点, 省市区信息, GNSS 定位点信息(如果有的话), 通过一定的策略融合, 赋值给 TencentLocation 中, 返回给开发者.

北斗定位原理: 基于腾讯全自研的卫星解算、差分定位、网络定位和传感器推算等多源融合定位能力. 北斗科普链接

1. 飘点


首先, 通过 location 的 getSourceProvider 方法, 确定该飘点的定位类型:

1.1 飘点是 GPS 点 (GPS_PROVIDER)

常见原因:

  • 有干扰
  • 手机 GPS 模块问题, 请尝试重启手机
  • 作弊

1.2 飘点是 WiFi 点 (WIFI_PROVIDER)

1.3 飘点是基站点 (CELL_PROVIDER)

然后, 提供信息用于排查

  • 提供基本信息
  • 提供发生飘点的时间(年月日-时分秒)
  • 提供 DeviceID
  • 提供错误的经纬度和正确的位置(经纬度或大致位置)
  • 飘点类型: GPS/WiFi/基站

2. 提高定位精度


2.1 提高网络定位精度

  • 插卡

  • 打开手机 WiFi 开关

  • 打开手机 WiFi 扫描开关 (设置 App 里)

2.2 提高单次定位精度

单次定位时, 默认的 request 配置, 会返回网络点. 使用 request.setGpsFirst(true) 会等待 GPS 点, 默认等待 5s. 5s 内有 GPS 点, 返回该 GPS 点; 5s 后还没有 GPS 点, 则返回网络点.

  • 等待时间默认 5s, 可以通过 request.setGpsTimeOut(3*1000) 修改.
  • 注意: 如果在室内, 大概率是没有 GPS 点的, 此时, 获取结果大概率会超过设置的等待时间, 造成定位慢的现象. 这里需要开发者自行评估. 速度和精度无法都提到 MAX 的效果.
    • 网络定位: 速度快, 精度较高, 可以通过 2.1 中的方式 引导用户, 进一步提高精度
    • GNSS 定位: 速度慢, 精度最高

3. 地理围栏


必须使用连续定位, 连续进行单次定位不会有相关事件的回调. 推荐使用圆形围栏, 并根据业务需求选择合适的半径.

4. 错误码


4.1 ERROR_NOCELL&WIFI_LOCATIONSWITCHOFF

  • 手机定位开关关闭了, 需要打开

  • 手机当时没有搜索到基站信息并且没有 WiFi 列表信息

    • 手机没有插卡, 会没有基站信息
    • 手机处于电梯或地下车库等地方, 也可能会没有基站或 wifi 列表信息
    • 没有打开 WiFi 开关
    • 没有打开 WiFi 扫描开关
  • 排查一下 App 被授予的权限(注意: 不是代码里请求的权限, 而是被用户同意的权限)

4.2 ERROR_SERVER_NOT_LOCATION

  • 未知错误, 需要本地日志分析

4.3 ERROR_NETWORK

  • 检查手机网络, 手机网络没问题, 则需要本地日志分析

5. 定位慢


看是 request.setGpsFirst(true) 是否传入的是 true. 详见 “2.2 提高单次定位精度”

6. 加入白名单的域名 (物联网, VPN)


  • 域名 1: lbs.map.iot.wechatpay.cn
  • 域名 2: lbs6.map.qq.com
  • 物联网卡给域名 1 加白
    • 物联网项目还需要调用此方法: request.getExtras().putString("LOCATION_URL_IOT","true");
  • VPN 给域名 2 加白

7. 北斗(仅北斗模式)


北斗库仅支持 Android 7 以及以上的的系统.

目前没有仅北斗模式 设置了 GNSS_SOURCE_BEIDOU_FIRST, 在有北斗信号的是时候会给北斗的点, 没有则会给 GNSS 的点, 也就是说一次连续定位中, 可能会有北斗和其他 GNSS 的点, 如只需要北斗的点, 自行通过 getProvider 方法过滤掉 GPS 即可

没有北斗的点, 排查以下情况

  • 不支持单次定位, 请使用连续定位
  • 手机系统需要 >= Android 7, 否则, 系统没有提供相应的 API, 无法实现北斗定位
  • 手机需要有网, 需要下载北斗相关数据
  • 位置开关已打开
  • App 有 Fine Location 权限 (注意: 不是代码里请求的权限, 而是被用户同意的权限)
  • 检查 key
    • key 的格式: “TencentMapDemo,MYUH4-5J3J4-Y7Z52-3XNSL-YT6SR”, 完整 key 为引号内所有内容
    • TencentLocationManagerOptions.setExtraKey("您的 key"); 传入的 key 是否完整
    • key 是否在有效期内
  • TencentLocationRequest 设置
    TencentLocationRequest request = TencentLocationRequest.create();
    requeset.setGnssSource(TencentLocationRequest.GNSS_SOURCE_BEIDOU_FIRST);
    
  • 当前地方可能观测量不好, 去室外开阔地方测试一下
  • 如果是手持 pos 机器等非手机设备, 可与手机同时测试, 看下是否是硬件问题

8. 经纬度和位置信息对不上


  • 如定位原理中介绍的, 省市区等信息是通过网络定位获取的. 如果网络定位出现漂移, 而刚好又有正确的 GNSS 定位点, 由于GNSS 的置信度更高, SDK 会返回 GNSS 的经纬度和网络定位时获取的省市区信息, 此时, 便会出现经纬度和地址信息对不上的情况.
  • 还有一种情况是, 网络定位和对应的地址是对的, 但此时 GNSS 的点飘了, 由于 SDK 无法判断 GNSS 的点是否是飘点, 仍会使用 GNSS 的经纬度和网络定位获取的地址, 返回给开发者.
  • 本质是发生了飘点, 需要排查飘点原因.

9. 逆地址和 POI相关


RequestLevel 设置为 REQUEST_LEVEL_POI 可获取当前位置的 POI 列表, 该列表不支持指定个数, 不支持翻页.

如需更高级的 POI 服务, 可以参考使用 WebService API

10. 没有定位回调


  • 需要调用 TencentLocationManager.setUserAgreePrivacy(true);

  • 需要设置正确的 key (二选一):

    • 动态设置
      TencentLocationManagerOptions.setKey("您申请的Key")
      
    • AndroidManifest 中设置
      <application>
          ...
          <meta-data android:name="TencentMapSDK" android:value="您申请的Key" />
      </application>
      
  • 断点调试, TencentLocationManager.getInstance() 是否获取到了 TencentLocationManager 的实例

11. 没有 GNSS 的点


  • 位置开关是否打开
  • App 有 Fine Location 权限 (注意: 不是代码里请求的权限, 而是被用户同意的权限)
  • 是否进入后台, 是否可以进行后台定位
  • 当前地方可能观测量不好, 去室外开阔地方测试一下

12. 选择连续还是单次定位


  • 打卡场景: 建议使用连续定位, 因为单次定位一般默认为网络定位, 且会使用缓存, 多次单次定位, 可能返回同一个点, 造成位置不更新的现象. 可以使用连续定位, 取一小段时间中精度最好的点, 且如果在室外, 很有可能获取到精度更好的 GNSS 的点.
  • 地理围栏场景: 目前只支持连续定位. 单次定位不会触发围栏事件.

13. 定位精度为 5000 或 1000


当定位失败时, 会使用系统的 nlp (network location provider) 提供的缓存点

  • 直接获取的 nlp 缓存点: 精度为 5000
  • 调用接口重新请求 nlp 缓存点: 精度为 1000 系统有可能会返回较早的点, 如果对点的实时性有要求, 使用时 check 一下时间戳

14. 国外定位


目前无法排查国外定位的相关问题. 国外定位只有经纬度信息, 没有逆地址信息

15. 楼层定位


仅在支持的大型商场和交通枢纽支持, 具体地点是否支持, 找位置小助手咨询

16. 坐标系


  • SDK 默认坐标系: GCJ02
  • 大陆和港澳: 设置成GCJ02 或者 WGS84, 就会返回对应的坐标
  • 台湾和国外: 不管设置的是什么坐标类型, 只会返回 WGS84 坐标

17. 方向


SDK 提供 2 个方向值

  • location.getBearing(): 只有位置来源是 GPS 时, 才可能有效
  • location.getDirection(): 方向来自传感器, 如果位置来源是 GPS, 会取 GPS 的方向
    • 主要是网络定位点, 通过 getBearing 方法无法获取方向
    • 需要在request 中配置后, 才能生效: request.setAllowDirection(true)
    • 比较耗电

18. 室内定位


通过 request 配置开启: request.setIndoorLocationMode(true)

开启室内定位模式后, 会提高 WiFi 扫描频率, 默认是30s 一次. 需要注意的是:

  • 是否能以室内定位模式的频率成功扫描, 取决于系统(比如 app 有系统权限等)
  • 如果可以以室内定位模式的频率扫描成功, 则 WiFi 信息更新更频繁, 网络定位请求也更频繁, 定位点更新也更频繁(最终该点是否回调给开发者, 取决于连续定位的频率: request.setInterval(10000))
  • 开启连续定位, 不会提高精度(即不会对 location.getDirection() 产生影响). 而是提高定位效果: 更新越频繁, 越能反映设备位置的变化, 而不是一段时间过去了, 位置还未更新

19. 导航 SDK 相关


导航 SDK 中封装了定位 SDK, 并提供部分定位能力. 所有接口查看导航 SDK 的文档, 定位 SDK 的文档不适用

  • 导航 SDK 中封装的定位的 RequestLevel 为 REQUEST_LEVEL_ADMIN_AREA, 且无法修改
  • 地理围栏文档

20. 上架常见问题


20.1 停止定位后, 仍然获取基站等信息

一般是有意或无意添加了多个 listener 导致的, 停止接口传入 null 才会清除所有 provider 和 listeners, 从而彻底停止定位

而上架检测一般是在后台时, APP 仍获取基站等信息, 造成审核不通过. 所以建议监听 app 进入后台事件, 然后在进入后台前调用下面的方法彻底关闭定位

mLocationManager.removeUpdates(null);

如果仍然上架失败, 打开本地日志, 尽量重复一下上架的操作, 提供本地日志来分析

21. 配额相关


获得定位 SDK 的商业授权后, 无配额限制, 无 QPS 限制. 从定位 SDK 获取逆地址信息不会消耗 WebService API 的配额

本页内容