requestLocationUpdates()方法在不改变位置的情况下提供更新 - Android

时间:2016-05-07 23:20:16

标签: android android-gps

我使用onLocationChanged LocationListener方法来检测设备位置的变化。在requestLocationUpdates方法中,我设置了最小时间= 5秒,最小距离= 2米,但即使我的设备根本没有移动(静止不动),requestLocationUpdates方法也会给我更新。请告诉我的代码有什么问题?

这是我的代码:

public class LocationDetector implements LocationListener {
    @Override
    public void onLocationChanged(Location location) {
        Log.d("GPS: ",location.getLatitude()+", "+location.getLongitude());
    }

LocationManager manager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

manager.requestLocationUpdates("gps", 5000, 2, new LocationDetector());

1 个答案:

答案 0 :(得分:2)

GPS位置可能会波动。如果您实际记录了收到的位置,那么每当位置更新到来时,您可能会发现位置实际上会变化2米或更长。

编辑:处理增加波动的想法:

如何处理GPS波动取决于您的应用需求。一些可能的想法包括:

如果您不需要非常准确的位置,请在requestLocationUpdates()来电中使用更高的距离限制,以便在非常小的位置更改时无法接收更新。您可以考虑用例所需的绝对必要准确度,然后使用最高可能的距离限制。

如果您不希望地点变化非常快,或者您不需要非常快速地对位置变化做出反应,那么请在requestLocationUpdates()电话中使用更高的时间限制。如果您有onLocationChanged()触发的非常繁重的代码,如果您总是通过网络获取某些数据(反向地理编码等),这也是有意义的。

时间限制对电池使用也有更大影响。 Android documentation说:

  

...位置提供商使用这种方式节省电力更加困难   minDistance参数,所以minTime应该是主要的工具   节省电池寿命。

如果你真的需要一个准确的位置,那么有一些方法可以减少波动。

首先,Location中收到的onLocationChanged()对象通常可以通过调用Location.getAccuracy()方法获得估算的准确度。您可以简单地忽略任何精度非常低的位置更新(与之前位置更新的准确性相比)。

如果您有最近位置的短缓冲区,也可以进行一些过滤。计算平均值将减少突然变化的数量,但也会增加响应时间。也就是说:位置的快速变化将在一段时间后完全显示在平均位置数据中。 (当然,平均数据会立即开始向该位置移动,但需要一段时间。)此外,它还会让峰值降低。一定数量。

如果快速响应时间很重要且任何主要的"尖峰"在数据应该被消除,然后计算中位数是一个更好的选择。它不会消除数据中的微小变化,但可以滤除随机尖峰。如果位置发生真正(永久)的突然变化,那么中值滤波会对只有非常小的延迟做出反应。

(这些东西很容易在你最喜欢的电子表格应用程序中试用。)