问题描述
大约两周前,我们应用的几个区域随机停止工作,特别是那些依赖于最新位置的区域。这发生在多个设备上,包括真实设备和模拟器。在此之前,它每次都在工作。对我们来说幸运的是,所有停止工作的东西都有一个标志,我们能够在生产中禁用它。
我们的位置包装器代码两年来几乎没有被改动过,并且在最近的唯一更改(这是微不足道的)后大约一个月运行良好。换句话说,它已经运行了两年没有问题。下面是片段。
现在,在注册接收位置更新后,我们在大部分时间的回调中不再获得结果。以下是回调和其他相关片段:
private val locationCallback = object : LocationCallback() {
override fun onLocationResult(locationResult: LocationResult?) {
Timber.tag("DERP").d("LocationProviderImpl.onLocationResult: got location; loc=${locationResult?.lastLocation}; thread=${Thread.currentThread().name}")
locationResult ?: return
subject.onNext(locationResult.lastLocation)
}
}
override fun getUpdatedLocation(request: LocationRequest): Observable<Location> {
try {
client.requestLocationUpdates(request,locationCallback,Looper.getMainLooper())
} catch (e: SecurityException) {
Timber.tag(LOGTAG).d(e,"security exception getting last location")
}
return subject
}
fun getDefaultLocationRequest(): LocationRequest = LocationRequest()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setNumUpdates(1)
.setFastestInterval(TimeUnit.MILLISECONDS.toMillis(500))
这是我们使用的库/版本:
implementation 'com.google.android.gms:play-services-auth:19.0.0'
implementation 'com.google.android.gms:play-services-base:17.5.0'
implementation 'com.google.android.gms:play-services-location:17.1.0'
implementation "com.google.android.gms:play-services-gcm:17.0.0"
其他一些注意事项:
- 回调间歇性地获得结果(可能是 15 次尝试中的 1 次)
- 没有押韵或原因,尝试了许多不同的黑客攻击,但没有运气。
-
lastLocation
每次都有效,但经常过时。 - 首先调用
lastLocation
似乎并没有使回调工作更可靠,正如文档中所指出的那样。 - 此位置提供程序(融合客户端的包装器)已用于应用的多个领域,但直到最近,我们才开始在最新功能中更多地使用它。
是否存在某种类型的配额或限制,我们以前没有达到但现在达到了?还有什么可能导致这种情况吗?
解决方法
尝试降级版本
implementation 'com.google.android.gms:play-services-location:17.0.0'
我也有过,我认为这是 17.1.0 版本的错误