Android融合位置api不提供屏幕关闭的一致更新

时间:2016-10-12 06:37:27

标签: android gps android-fusedlocation

我有一些代码在我的应用中每秒运行多次。我想在每个周期中获取我的位置。我使用以下内容:

Location myLastPos = LocationServices.FusedLocationApi.getLastLocation(googleApiClient)

我的应用也使用PARTIAL_WAKE_LOCK在后台运行。随着屏幕上的一切似乎没问题。当我关闭屏幕时,我的应用程序仍然正常运行,但我不再一致地获得位置更新。 看起来我更新的频率更低(通常在更新之间的几分钟)。我正在使用以下方法检查位置的时间戳:

myLastPos.getElapsedRealtimeNanos()

我还发现,即使屏幕打开,我也会得到一些奇怪的结果。有时我会在更新之间得到几毫秒,有时我会得到几秒钟。这一切都非常令人担忧。有人可以帮助我正确使用FusedLocationApi 建议替代方案。我真正想要的是在没有谷歌图书馆阻碍的情况下,每秒直接轮询gps直接进行lat / long。

1 个答案:

答案 0 :(得分:0)

getLastLocation()方法只获取设备碰巧知道的最后一个已知位置。 "最后的已知位置"这意味着:它可能不是最新的。地点确实带有时间戳,可用于评估位置是否仍然相关。

设备无法自行确定其位置,但仅在某些应用程序请求该位置时才会确定。因此,您的应用现在依赖于请求位置更新的其他应用。

如果您需要每隔几秒钟更新一次,请自行请求定期更新。

Android documentation推荐使用FusedLocationProvider,但LocationManager也是完全有效的选项,如果有任何理由可以避免使用Google Play服务。

基本思路是首先请求位置更新:

// 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的方法非常相似。