Android FusedLocationProviderClient 突然不再使用 Location 调用回调

问题描述

大约两周前,我们应用的几个区域随机停止工作,特别是那些依赖于最新位置的区域。这发生在多个设备上,包括真实设备和模拟器。在此之前,它每次都在工作。对我们来说幸运的是,所有停止工作的东西都有一个标志,我们能够在生产中禁用它。

我们的位置包装器代码两年来几乎没有被改动过,并且在最近的唯一更改(这是微不足道的)后大约一个月运行良好。换句话说,它已经运行了两年没有问题。下面是片段。

现在,在注册接收位置更新后,我们在大部分时间的回调中不再获得结果。以下是回调和其他相关片段:

  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 版本的错误