本文总结了腾讯定位SDK常见的使用问题
如果遇到定位SDK引起app崩溃,或产生一些跟预期完全不符的行为怀疑是bug,请向我们(QQ 86147470、410063005)发送 问题现象描述 + 错误日志,并且告知您的调用方式或发送代码片断
注意不要混淆 native 方法
-keepclasseswithmembernames class * {
native <methods>;
}
如果使用的 Android SDK版本低于18,混淆时可能出现 android.location.Location
相关的错误,添加以下proguard配置:
-dontwarn android.location.Location
定位SDK从4.0版本开始还需要添加以下配置
-dontwarn org.eclipse.jdt.annotation.**
定位SDK从4.1版本开始还需要添加以下配置
-keepclassmembers class ** {
public void on*Event(...);
}
完整的配置如下:
-keepclassmembers class ** {
public void on*Event(...);
}
-keepclasseswithmembernames class * {
native <methods>;
}
-dontwarn org.eclipse.jdt.annotation.**
-dontwarn android.location.Location
关于GPS应有以下几个基本认识:
定位存在精度问题,精度由高到低如下:
GPS > Wi-Fi > 基站
在不开 GPS 和 Wi-Fi 的情况下,如果遇到覆盖范围相当大的基站,定位精度将非常低。
注:开 Wi-Fi 指打开 Wi-Fi 开关即可,并不要求一定连接到某个热点。如果您的 app 对精度要求较高,建议 app 提示用户打开 Wi-Fi 以提高定位精度(类似于地图类 app 提示用户打开 GPS)。
模拟器不能得到基站和Wi-Fi热点信息,所以不能定位。请在真实设备上使用定位SDK进行开发。
TencentLocation location = ...;
String provider = location.getProvider();
if (TencentLocation.GPS_PROVIDER.equals(provider)) {
// location 是GPS定位结果
} else if (TencentLocation.NETWORK_PROVIDER.equals(provider)) {
// location 是网络定位结果
}
比如, 将 getCity()
的返回值打印出来发现为空。
由于使用场景的差异非常大(有些app只需将坐标点显示在底图上,有些app需要街道地区,有些app需要知道行政区划,有些app需要附近的POI,等等),定位请求有不同的 Request Level
。
不同的 Level 的 TencentLocationRequest 请求得到的 TencentLocation 的完整程度不同。定位前应当设置正确的 Request Level
。
完全没有必要。建议直接在主线程中调用 TencentLocationManager.requestLocationUpdates()
来定位。
原因如下:
TencentLocationListener.onLocationChanged()
是在主线程中回调,可直接操作 UI如上所说,没必要在新的线程中定位。使用如下方式可以将定位SDK内部操作放到新的线程中,一定程度上减少主线程负担:
TencentLocationManager locationManager = ...
// 创建并运行 HandlerThread
HandlerThread thread = new HandlerThread();
thread.start();
// 在主线程发起定位
locationManager.requestLocationUpdates(request, listener, thread.getLooper());
目前只支持一个 TencentLocationListener。连续调用后,将自动取消原来的 listener,并使用新的 request 和 listener 定位。
可以利用这个特点来调整定位频率而不必 removeUpdates()
后再 requestLocationUpdates()
。
定位完成后,只需要调用 一次 removeUpdates()
来取消定位。
建议通过下面步骤排查:
定位SDK使用一些策略过滤掉模拟的GPS位置,建议使用真实GPS位置测试。