首页 文章

LocationManager返回带有当前时间戳的旧缓存“Wifi”位置

提问于
浏览
8

我想要获取当前位置 . 为此我实现了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”位置具有当前时间戳而不是最初检索时的时间戳 .

3 回答

  • 2

    这很有帮助:

    A Deep Dive Into Location

    最后是该演讲的源代码:

    android-protips-location

  • 0

    这是我遇到的一个已知问题,并对发生这种情况的原因进行了一些研究 .

    以下是我的观察:

    • 通常这种情况发生在失去网络连接后发生移动网络切换时,这可能不一定足以让用户意识到 .

    • 考虑一下您正乘坐地铁列车,然后在A站下车,然后在B站下车,现在当您在B站下车时,网络小区ID可能/可能仍然是A站,当然它会做手 - 并转移到B站 .

    • 但是,如果你在交接之前呼叫getLocation是活跃的,那么你将得到一个位置可能是10公里和15分钟的位置 .

    首先要了解网络位置的工作原理: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
        }
    }
    
  • 6

    在我对代码进行一些更改之前,我一直面临同样的问题 .

    发生的事情是我在请求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) . 不确定它是否适合你 .

相关问题