我正在尝试获取当前位置。为此,我实现了一个 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”位置具有当前时间戳,而不是最初检索时的时间戳。
这是我遇到过的一个已知问题,并对为什么会发生这种情况进行了一些研究。
以下是我的观察:
- 通常,当失去网络连接后发生移动网络切换时,就会发生这种情况,这对于用户来说可能不一定足够重要。
- 假设你正在乘坐地铁,你在 A 站上车,在 B 站下车,现在当你在 B 站下车时,网络小区 ID 可能/可能不再是 A 站,当然它会做一个手动操作:下车前往B站。
- 然而,如果您在交接之前调用 getLocation 处于活动状态,您将获得 A 站位置,该位置可能是 10 公里 15 分钟后的位置。
首先了解网络定位的工作原理:
Android 具有当前连接到的塔的 cellId,然后 Google 使用该 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
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)