Android 融合位置 api 不提供与屏幕关闭一致的更新
Android fused location api not providing consistent updates with screen off
我有一些代码在我的应用程序中每秒运行多次。我试图在每个周期中获取我的位置。我正在使用以下内容:
Location myLastPos = LocationServices.FusedLocationApi.getLastLocation(googleApiClient)
我的应用程序还使用 PARTIAL_WAKE_LOCK 在后台运行。屏幕上一切似乎都正常。当我关闭屏幕时,我的应用程序仍然正常运行,但我不再持续获得位置更新。
看来我获得更新的频率要低得多(通常在两次更新之间间隔几分钟)。我正在使用以下方法检查位置的时间戳:
myLastPos.getElapsedRealtimeNanos()
我还发现即使在屏幕打开时我也会得到一些奇怪的结果。有时我在更新之间有几毫秒的时间,有时我有几秒钟的时间。这一切都非常令人担忧。有人可以帮助我正确使用 FusedLocationApi 或 建议替代方案。我真正想要的是每秒几次直接为 lat/long 轮询 gps 而没有 google 库妨碍。
getLastLocation()
方法只是获取设备碰巧知道的最后一个已知位置。 "last known location" 这里的意思就是:它可能不是最新的。位置确实带有时间戳,可用于评估位置是否仍然相关。
设备不会自行确定其位置,只有在某些应用程序请求位置时才会确定。因此,您的应用程序现在依赖于请求位置更新的其他应用程序。
如果您需要每隔几秒更新一次,请自行请求定期更新位置。
Android documentation recommends the FusedLocationProvider, but the LocationManager 也是一个完全有效的选项,如果有任何理由避免 Google 播放服务。
基本思路是先请求位置更新:
// Using LocationManager as an example.
mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
// Using GPS, requesting location updates as soon as available and even for
// the smallest changes. Here 'this' refers to our LocationListener
// implementation.
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
然后由侦听器接收更新:
@Override
public void onLocationChanged(Location location) {
// We received a location update.
// Copy the value from the method parameter to our
// class member variable.
mLocation = location;
}
当您不再需要更新时,您应该取消请求:
mLocationManager.removeUpdates(this);
FusedLocationProvider 的方法非常相似。
我有一些代码在我的应用程序中每秒运行多次。我试图在每个周期中获取我的位置。我正在使用以下内容:
Location myLastPos = LocationServices.FusedLocationApi.getLastLocation(googleApiClient)
我的应用程序还使用 PARTIAL_WAKE_LOCK 在后台运行。屏幕上一切似乎都正常。当我关闭屏幕时,我的应用程序仍然正常运行,但我不再持续获得位置更新。 看来我获得更新的频率要低得多(通常在两次更新之间间隔几分钟)。我正在使用以下方法检查位置的时间戳:
myLastPos.getElapsedRealtimeNanos()
我还发现即使在屏幕打开时我也会得到一些奇怪的结果。有时我在更新之间有几毫秒的时间,有时我有几秒钟的时间。这一切都非常令人担忧。有人可以帮助我正确使用 FusedLocationApi 或 建议替代方案。我真正想要的是每秒几次直接为 lat/long 轮询 gps 而没有 google 库妨碍。
getLastLocation()
方法只是获取设备碰巧知道的最后一个已知位置。 "last known location" 这里的意思就是:它可能不是最新的。位置确实带有时间戳,可用于评估位置是否仍然相关。
设备不会自行确定其位置,只有在某些应用程序请求位置时才会确定。因此,您的应用程序现在依赖于请求位置更新的其他应用程序。
如果您需要每隔几秒更新一次,请自行请求定期更新位置。
Android documentation recommends the FusedLocationProvider, but the LocationManager 也是一个完全有效的选项,如果有任何理由避免 Google 播放服务。
基本思路是先请求位置更新:
// Using LocationManager as an example.
mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
// Using GPS, requesting location updates as soon as available and even for
// the smallest changes. Here 'this' refers to our LocationListener
// implementation.
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
然后由侦听器接收更新:
@Override
public void onLocationChanged(Location location) {
// We received a location update.
// Copy the value from the method parameter to our
// class member variable.
mLocation = location;
}
当您不再需要更新时,您应该取消请求:
mLocationManager.removeUpdates(this);
FusedLocationProvider 的方法非常相似。