Fused Location Provider - onLocationChanged 停止调用
Fused Location Provider - onLocationChanged stops getting called
在我们的应用程序中,我们使用融合位置提供程序 (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)监控位置可用性。通常我们发现让用户重置他们的设备(开机、关机)可以解决问题。
我们的问题是:
- 有没有其他人注意到 FLP 的这个问题?
- 除了让用户重置之外,我们还能做些什么来解决这个问题?删除添加位置更新会有帮助吗?
- 我们 can/should 是否收集了更多信息来诊断问题?
您可以尝试这样检查 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 版本。
我在各种设备上广泛使用 FusedLocationProvider,包括低端和高端,我也看到过类似的问题,其中 GPS 数据在两者之间有错误的补丁。因此,我针对这些与可靠性和稳健性相关的问题(如下所列)进行了一些更改,在那之后就没再遇到过这些问题。
根据我的经验,此类问题的可能解决方案是:
正在更新 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.
使 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.
正在连接上重新连接 GoogleAPIClient suspension/error
我曾见过由于网络状况不佳或其他原因导致 GoogleAPIClient 连接暂停或 returns 错误的情况。虽然我无法验证这对位置数据丢失的直接影响,但这很可能是这种情况下的一个原因。为了支持这一点,如果发生此 GoogleAPIClient 连接问题,位置更新的重置将失败,这也是您观察到的情况。
Sol: A simple reconnection of GoogleAPIClient on suspension or error can resolve this.
除此之外,还有一个原因可能导致此问题:
设备 GPS 修复丢失:
有时设备会丢失其 GPS 定位,导致在它可以恢复 GPS 定位之前没有 GPS 数据。绝对没有办法确定位置是否由于 GPS 定位而丢失。重置设备的位置设置会影响设备尝试 GPS 定位,这也可能是这里的原因。
免责声明:我是一名 Android 开发人员@ HyperTrack and we're developing a location stack for developers who are building location features in their apps and these are the kind of problems we have been solving. It would be great for you to test out similar scenarios using our SDKs,如果您仍然看到这个问题,我们很乐意帮助您它的根本原因并解决问题。
在我们的应用程序中,我们使用融合位置提供程序 (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)监控位置可用性。通常我们发现让用户重置他们的设备(开机、关机)可以解决问题。
我们的问题是:
- 有没有其他人注意到 FLP 的这个问题?
- 除了让用户重置之外,我们还能做些什么来解决这个问题?删除添加位置更新会有帮助吗?
- 我们 can/should 是否收集了更多信息来诊断问题?
您可以尝试这样检查 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 版本。
我在各种设备上广泛使用 FusedLocationProvider,包括低端和高端,我也看到过类似的问题,其中 GPS 数据在两者之间有错误的补丁。因此,我针对这些与可靠性和稳健性相关的问题(如下所列)进行了一些更改,在那之后就没再遇到过这些问题。
根据我的经验,此类问题的可能解决方案是:
正在更新 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.
使 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.
正在连接上重新连接 GoogleAPIClient suspension/error 我曾见过由于网络状况不佳或其他原因导致 GoogleAPIClient 连接暂停或 returns 错误的情况。虽然我无法验证这对位置数据丢失的直接影响,但这很可能是这种情况下的一个原因。为了支持这一点,如果发生此 GoogleAPIClient 连接问题,位置更新的重置将失败,这也是您观察到的情况。
Sol: A simple reconnection of GoogleAPIClient on suspension or error can resolve this.
除此之外,还有一个原因可能导致此问题:
设备 GPS 修复丢失: 有时设备会丢失其 GPS 定位,导致在它可以恢复 GPS 定位之前没有 GPS 数据。绝对没有办法确定位置是否由于 GPS 定位而丢失。重置设备的位置设置会影响设备尝试 GPS 定位,这也可能是这里的原因。
免责声明:我是一名 Android 开发人员@ HyperTrack and we're developing a location stack for developers who are building location features in their apps and these are the kind of problems we have been solving. It would be great for you to test out similar scenarios using our SDKs,如果您仍然看到这个问题,我们很乐意帮助您它的根本原因并解决问题。