当前位置: 首页 > 知识库问答 >
问题:

Android FusedLocationProviderClient突然不再使用位置调用回调

杜霍英
2023-03-14

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

我们的位置包装器代码两年来几乎没有被触碰过,在最近唯一一次更改(这是微不足道的)后,它在一个月内运行良好。换句话说,两年来它一直在毫无问题地工作。下面是一些片段。

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

  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()
    .html" target="_blank">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似乎不会使回调工作得更可靠,正如文档中所示
  • 这个位置提供者(融合客户端的包装器)曾在应用程序的多个领域使用过,但直到最近,我们才开始在最新功能中更多地使用它

共有2个答案

宦博雅
2023-03-14

嗨,我最近也在为同样的问题而挣扎。它首先出现在一个设备上,然后出现在另一个设备上。与您的情况一样,我没有对位置服务进行任何修改,只是开始出现我要么根本没有回调,要么在启动时只有1或2次回调。虽然我只能推测导致崩溃的根本原因是什么,但我认为错误不在你的应用程序中,而在谷歌play服务中。

在我的例子中,重启应用程序没有帮助,但重启设备确实有帮助。我注意到在第一个bug发生之前,google play服务最近有一个更新,我怀疑这可能与此有关。

如果您能够重新处理此问题,则可能值得登录:

GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(mContext);

或试验:

GoogleApiAvailability.getInstance().makeGooglePlayServicesAvailable(activity)

GoogleApiAvailability.getInstance().checkApiAvailability(googleApi)

我知道这不是一个真正的答案,但也许它有助于更接近根本原因

淳于升
2023-03-14

尝试降级版本

implementation 'com.google.android.gms:play-services-location:17.0.0'

我有相同的,我认为这是一个错误在17.1.0版本

 类似资料:
  • 到目前为止,我做到了: 我的Ajax1函数返回ajax对象。我的等待函数看起来像这样: 问题是第二个ajax请求函数(Ajax2)并没有等待等待函数!编辑:我也试过: 什么也没变。从jQuery文档: 在将多个延迟对象传递给jQuery.when的情况下,该方法将从新的“master”返回promise“延迟对象,跟踪已传递的所有延迟的聚合状态。当所有延迟被解决时,该方法将立即解决其主延迟,或者当

  • 我在weblogic中遇到了一个奇怪的问题,我们的web客户端突然无法调用webservice并连续数小时抛出以下异常。在webservice服务器端,未捕获任何异常,但在访问日志中仅找到http 500。重新启动托管webservice的weblogic托管服务器后,问题得到了解决。 web客户端和webservice服务器几个月来一直工作正常,但现在突然出现了问题。我相信这不是应用程序错误,因

  • 我一直在使用java后端,它一直工作正常,直到昨天我和另一个人都开始收到以下错误消息: 无法解析配置“:compileClasspath”的所有文件。无法解析组织。springframework:SpringBeans:[2.5.2,3]。要求者:项目: 我对gradle有点熟悉,但只与android有关,而不是java/spring,以前从未遇到过这种错误。

  • 我读了一些关于它的帖子,但是没有解决我的问题。我有一个类是单例的,这个类的一个方法正在另一个类中调用。我需要模拟这个方法调用。 另一类是: 我在嘲笑我在测试课上学到的方法。我曾尝试使用doReturn,而不是其他帖子中建议的Return,但没有帮助。 我的测试课程是: 那么为什么当a.doSomeStuff被调用时我不能实现呢?这里怎么了?

  • 问题: 我正在尝试为Wordpress插件注册自定义endpoint。我面临的问题是,当我调用add_action('rest_api_init',回调)时,回调函数没有被调用。在该回调函数中存在“register_rest_route()”方法,而该方法又未被调用,我无法注册任何自定义终结点。 < li >我正在使用docker进行开发 < li >没有抛出任何错误 代码: 问题: 代码到达“v

  • 我在Azure Active Directory中有一个租户场景,其中API1需要使用身份验证调用另一个API2,并且API1是从SPA调用的。 只是将API1中从SPA接收到的用户JWT传递给调用API2进行身份验证是否正确? 类似于:https://github.com/azure-samples/active-directory-dotnet-webapi-onbehalfof