草庐IT

android - Fused Location Provider - onLocationChanged 停止调用

coder 2023-11-27 原文

在我们的应用程序中,我们使用融合位置提供程序 (FLP) 来跟踪位置。我们注意到,有时应用程序会进入位置回调停止调用的状态。该应用程序主要用于两款平板电脑(nexus 7 和 LG G-pad 8.3)。我们已经看到这两个设备上都出现了这个问题。一般来说,重置设备似乎可以缓解这个问题。我们相信我们遵循了使用 FLP 的大多数最佳实践。但为了以防万一,我们将这段示例代码放在一起,它说明了我们如何使用 FLP。

获取 google api 客户端并调用连接:

m_googleApiClient = builder
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();
m_googleApiClient.connect()

连接后我们开始监听位置回调:

@Override
public void onConnected(Bundle bundle) {
    m_fusedLocationProviderApi.requestLocationUpdates(m_googleApiClient, m_locationRequest, this);
}

位置请求如下所示:

    LocationRequest locationRequest = LocationRequest.create();
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    locationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);
    locationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);

然后我们像这样实现回调:

    @Override
public void onLocationChanged(Location location) {
   // set location member var and record timestamp.
}

当问题发生时,我们似乎没有收到任何错误回调。当我们检测到很长时间没有收到 GPS 时,我们也尝试在 google api 客户端上调用 reset() 。我们还每 2 秒使用一个计时器(使用 getLocationAvailability)监控位置可用性。通常,我们发现让用户重置他们的设备(开机、关机)可以解决问题。

我们的问题是:

  1. 还有其他人注意到 FLP 的这个问题吗?
  2. 除了让用户重置之外,我们还能做些什么来解决这个问题?删除添加位置更新会有帮助吗?
  3. 我们是否可以/应该收集更多信息来诊断问题?

最佳答案

我在低端和高端的各种设备上广泛使用 FusedLocationProvider,并且看到了类似的问题,即 GPS 数据在两者之间有错误的补丁。因此,我针对这些与可靠性和稳健性相关的问题(如下所列)进行了一些更改,并且在那之后没有看到这些问题。

根据我的经验,此类问题的可能解决方案是:

  1. 更新 Play 服务: 当我遇到这些问题时,我使用的是 7.x - 8.x 范围内的 Android Play 服务版本。

    Sol: In the recent past, updating to 10.x versions of play services have helped in resolving the issues. We've not seen these issues post the update, so this could definitely be one of the reasons in your case as well.

  2. 让 Android 服务更可靠、更健壮: 这是我们看到 GPS 数据中断的主要原因之一,并且在重新启动设备或再次初始化设置时,我们通常会重新启动服务。因此,重新启动的服务可能会恢复正常的位置更新。

    Sol: I use a Foreground Service instead of background service and this is by far the most reliable solution here but this comes with a sticky UI notification for the user. If not for this, then keeping a health check (running or killed) for the background service can be a good option as well.

  3. 在连接暂停/错误时重新连接 GoogleAPIClient 我曾见过由于网络状况不佳或其他原因导致 GoogleAPIClient 连接暂停或返回错误的情况。虽然我无法验证这对位置数据丢失的直接影响,但这很可能是这种情况下的一个原因。为了支持这一点,如果发生此 GoogleAPIClient 连接问题,位置更新的重置将失败,这也是您观察到的情况。

    Sol: A simple reconnection of GoogleAPIClient on suspension or error can resolve this.

除此之外,还有一个原因可能导致此问题:

设备 GPS 修复丢失: 有时设备会丢失其 GPS 定位,导致在它可以恢复 GPS 定位之前没有 GPS 数据。绝对没有办法确定位置是否由于 GPS 定位而丢失。重置设备的位置设置会影响设备尝试 GPS 定位,这也可能是这里的原因。

免责声明:我是一名 Android 开发者 @ HyperTrack我们正在为在其应用程序中构建位置功能的开发人员开发位置堆栈,这些都是我们一直在解决的问题。如果您使用我们的 SDKs 测试类似的场景,那将是很好的选择如果您仍然看到问题,我们很乐意帮助您找出问题的根本原因并解决问题。

关于android - Fused Location Provider - onLocationChanged 停止调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37395391/

有关android - Fused Location Provider - onLocationChanged 停止调用的更多相关文章

随机推荐