【问题标题】:LocationManager returns old cached "Wifi" location with current timestampLocationManager 返回具有当前时间戳的旧缓存“Wifi”位置
【发布时间】:2011-10-06 20:19:24
【问题描述】:

我正在尝试获取当前位置。为此,我实现了一个 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”位置有一个当前时间戳,而不是最初检索时的时间戳。

【问题讨论】:

  • 这不是一个真正的答案,但我只是想向您确认这至少在 API8 之前一直发生,而且我也遇到了同样的问题。正如有人在其中一个答案中所做的那样,我为 wifi 位置实施了一个简单的“噪声过滤器”,我在其中查看是否可能发生了行进距离,但这并不完美..
  • 我也有同样的问题。你必须解决它?

标签: android location wifi


【解决方案1】:

这是我遇到的一个已知问题,并针对为什么会发生这种情况进行了一些研究。

以下是我的观察:

  • 这通常发生在网络连接丢失后发生移动网络切换时,这可能并不一定足以让用户意识到。
  • 假设您乘坐地铁,在 A 站上车并在 B 站下车,现在当您在 B 站下车时,网络单元 ID 可能/可能不会仍然是 A 站,当然可以放手并转移到 B 站。
  • 但是,如果您在切换前调用 getLocation 处于活动状态,您将获得可能在 10 公里和 15 分钟后返回的 A 站位置。

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

【讨论】:

  • 我可能有类似的问题,只是它与基于 Wifi 的位置有关:连接到 Wifi A 并离开,然后连接到 Wifi B,我得到了 Wifi A 的位置这是古老而遥远的。我去看看nickfox提供的信息...
  • 是的,只是将蜂窝网络转换为 wifi 几乎相同。
  • 我也遇到过这个问题。有时我跑了20多公里后位置也没有改变。在旅途中,可能会有很多小区 ID。我们如何解释这个问题?
  • 当我的应用程序出现这个问题时,谷歌地图可以正确获取位置。如果单元格 id 错误,则很难解释这一点。
  • 如果谷歌地图可以正确获取位置,那么您的应用程序没有理由不获取它。您确定您正在同时收听网络和 GPS 位置提供商的声音吗?
【解决方案2】:

这很有帮助:

A Deep Dive Into Location

最后是该演讲的源代码:

android-protips-location

【讨论】:

  • 谢谢,非常有趣。不幸的是,大多数功能仅适用于 Gingerbread 及更高版本。我正在针对 API 7 进行开发,可能会使用 8。我仍然不清楚为什么 LocationManager 会传递具有当前时间戳的旧位置。这表明它是当前位置,但不是。
  • 我错了,您发布链接的源代码也涵盖了较旧的 API 级别,确实非常有用。
  • 伟大的链接!基于手机状态、网络可用性、wifi 与手机、电池寿命的位置更新和更新频率的绝妙技巧。
  • 我遵循文章“深入了解位置”的所有建议,但我仍然遇到同样的问题。
  • I/O 链接不再可用。
【解决方案3】:

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

发生的情况是,我在请求 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)上对此进行了测试。不确定它是否适合您。

【讨论】:

    猜你喜欢
    • 2011-02-02
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 2018-10-25
    • 2014-11-02
    • 2015-12-29
    • 2022-06-22
    相关资源
    最近更新 更多