0

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

Location myLastPos = LocationServices.FusedLocationApi.getLastLocation(googleApiClient)

我的应用程序还使用 PARTIAL_WAKE_LOCK 在后台运行。屏幕上的一切似乎都很好。当我关闭屏幕时,我的应用程序仍然正常运行,但我不再持续获得位置更新。看来我获得更新的频率要低得多(通常在两次更新之间有几分钟)。我正在使用以下方法检查位置的时间戳:

myLastPos.getElapsedRealtimeNanos()

我还发现,即使屏幕打开,我也会得到一些奇怪的结果。有时我在更新之间有几毫秒,有时我有几秒钟。这一切都非常令人担忧。有人可以帮助我正确使用 FusedLocationApi还是建议替代方法。我真正想要的只是每秒直接轮询 gps 几次纬度/经度,而不会妨碍谷歌图书馆。

4

1 回答 1

0

getLastLocation()方法只是获取设备碰巧知道的最后一个已知位置。这里的“最后已知位置”的确切含义是:它可能不是最新的。位置确实带有时间戳,可用于评估该位置是否仍然相关。

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

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

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

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

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

于 2016-10-14T08:32:36.260 回答