【问题标题】:Fused Location Provider - onLocationChanged stops getting called融合位置提供程序 - onLocationChanged 停止被调用
【发布时间】:2016-09-20 14:15:02
【问题描述】:

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

获取google api客户端并调用connect:

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. 我们可以/应该收集更多信息来诊断问题吗?

【问题讨论】:

  • 我遇到了同样的问题。您使用的是什么版本的 Google Play 服务,以及设备上的操作系统版本,我想知道这是否会有所不同?
  • 我最近开始使用 9.2.1,但还没有发现问题(手指交叉)。
  • 我最近遇到了完全相同的问题。自从升级您的 Google Play 服务版本后,您是否遇到过这个问题。谢谢。
  • 是的,升级后我们再也没有见过它。虽然我不再从事这个项目,但据我所知,它可能会再次发生。

标签: android gps google-play-services location-services fusedlocationproviderapi


【解决方案1】:

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

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

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

    Sol:最近,更新到 10.x 版本的播放服务有助于解决这些问题。我们没有在更新后看到这些问题,因此这也绝对可能是您的情况的原因之一。

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

    Sol:我使用前台服务而不是后台服务,这是迄今为止最可靠的解决方案,但这会为用户提供一个粘性 UI 通知。如果不是这样,那么保持后台服务的运行状况检查(运行或终止)也是一个不错的选择。

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

    Sol:在暂停或出错时简单重新连接 GoogleAPIClient 即可解决此问题。

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

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

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

【讨论】:

  • 感谢详细解答!
【解决方案2】:

您可以尝试像这样检查 LocationSettings:

    request = LocationRequest.create();
    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder().addLocationRequest(request);
    builder.setAlwaysShow(true);
    PendingResult<LocationSettingsResult> result =
            LocationServices.SettingsApi.checkLocationSettings(apiClient, builder.build());
    result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
        @Override
        public void onResult(@NonNull LocationSettingsResult result) {
            final Status status = result.getStatus();
            switch (status.getStatusCode()) {
                case LocationSettingsStatusCodes.SUCCESS:
                    LocationServices.FusedLocationApi.requestLocationUpdates(apiClient, request, locationListener);
                    break;
                case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                    try {
                        status.startResolutionForResult(context, REQUEST_CODE);
                    } catch (IntentSender.SendIntentException e) {}
                    break;
                case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                    break;
            }
        }
    });

然后在onActivityResult处理设置请求

switch (requestCode) {
    case REQUEST_CODE:
      switch (resultCode) {
        case Activity.RESULT_OK:
        // All required changes were successfully made
        LocationServices.FusedLocationApi.requestLocationUpdates(apiClient, request, locationListener);
        break;
        case Activity.RESULT_CANCELED:
        // The user was asked to change settings, but chose not to
        break;
        default:
        break;
      }
    break;
}

如果没有帮助,请尝试降级 google-play-services 版本。

【讨论】:

  • 是的,我知道此设置检查。我不认为设置有问题......我实际上大部分时间都会收到回调。问题是有时我们会进入回调停止发生的状态,必须重置设备才能再次开始获取它。
猜你喜欢
  • 1970-01-01
  • 2013-08-02
  • 2013-09-01
  • 1970-01-01
  • 2014-11-29
  • 2014-09-05
  • 1970-01-01
  • 2019-07-28
  • 2015-12-22
相关资源
最近更新 更多