我正在尝试获取当前位置。为此,我实现了LocationListener并为网络和GPS提供商注册它:
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
然后我阻止了30秒并使用传递给侦听器的第一个位置
onLocationChanged()
方法,精度为100米或更高。
大部分时间这都很好。如果手机连接到某个Wifi网络,只需一秒钟即可获得正确的位置,精确度约为50米。如果没有Wifi但启用了GPS,那么获取位置当然需要一段时间。
然而,有时候,当连接到Wifi并获得当前位置时,会提供一些旧的(缓存?)之前的“Wifi”位置 - 它可能距离当前位置15分钟,距离15公里。 问题是,
location.getTime()
返回当前时间 - 因此无法知道该位置是否旧。
我想我必须实现一个更精细的解决方案 - 我只想知道为什么这些旧的“Wifi”位置具有当前时间戳,而不是最初检索时的时间戳。
答案 0 :(得分:6)
这是我遇到的一个已知问题,并对发生这种情况的原因进行了一些研究。
以下是我的观察:
首先了解网络位置的工作原理: Android具有当前连接到的塔的cellId,然后谷歌使用此ID执行查找并获取大致位置信息,其精确度范围从50米(最好的一个)到几千米。如果cellId不正确,如上例所示,那么您将收到错误的位置。
除了使用可以消除此噪音的自定义算法之外,您无法避免这种情况。像
这样的东西if (location from network) {
if (speed obtained from the difference between previous and current location is greater than say 30 m/s) {
ignore this location as noise
} else {
location is correct
}
}
答案 1 :(得分:2)
答案 2 :(得分:0)
在我对代码进行一些更改之前,我一直面临同样的问题。
发生的事情是我在请求GPS和网络位置更新时附加了相同的LocationListener,而且我遇到了“奇怪”的问题,包括使用当前时间获取旧的WIFI位置更新。
这是我的旧代码:
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10000, 0, locationListener);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 0, locationListener);
显然这是一个相当“不安全”的事情(对不起,Android新手在这里)所以我把它改成了:
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10000, 0, networkLocationListener);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 0, gpsLocationListener);
当然,我必须定义2个单独的onLocationChanged代码块来处理2个侦听器。
嗯,它确实解决了我的问题。我在Gingerbread上测试了它(API级别:8)。不确定它是否适合你。