我使用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());
答案 0 :(得分:2)
GPS位置可能会波动。如果您实际记录了收到的位置,那么每当位置更新到来时,您可能会发现位置实际上会变化2米或更长。
编辑:处理增加波动的想法:
如何处理GPS波动取决于您的应用需求。一些可能的想法包括:
如果您不需要非常准确的位置,请在requestLocationUpdates()
来电中使用更高的距离限制,以便在非常小的位置更改时无法接收更新。您可以考虑用例所需的绝对必要准确度,然后使用最高可能的距离限制。
如果您不希望地点变化非常快,或者您不需要非常快速地对位置变化做出反应,那么请在requestLocationUpdates()
电话中使用更高的时间限制。如果您有onLocationChanged()
触发的非常繁重的代码,如果您总是通过网络获取某些数据(反向地理编码等),这也是有意义的。
时间限制对电池使用也有更大影响。 Android documentation说:
...位置提供商使用这种方式节省电力更加困难 minDistance参数,所以minTime应该是主要的工具 节省电池寿命。
如果你真的需要一个准确的位置,那么有一些方法可以减少波动。
首先,Location
中收到的onLocationChanged()
对象通常可以通过调用Location.getAccuracy()
方法获得估算的准确度。您可以简单地忽略任何精度非常低的位置更新(与之前位置更新的准确性相比)。
如果您有最近位置的短缓冲区,也可以进行一些过滤。计算平均值将减少突然变化的数量,但也会增加响应时间。也就是说:位置的快速变化将在一段时间后完全显示在平均位置数据中。 (当然,平均数据会立即开始向该位置移动,但需要一段时间。)此外,它还会让峰值降低。一定数量。
如果快速响应时间很重要且任何主要的"尖峰"在数据应该被消除,然后计算中位数是一个更好的选择。它不会消除数据中的微小变化,但可以滤除随机尖峰。如果位置发生真正(永久)的突然变化,那么中值滤波会对只有非常小的延迟做出反应。
(这些东西很容易在你最喜欢的电子表格应用程序中试用。)