【问题标题】:LocationManager minDistance settings issueLocationManager minDistance 设置问题
【发布时间】:2012-12-14 19:14:59
【问题描述】:

[我知道这与 2010 年提出的问题重复,但该问题从未真正得到答案]

我正在将我的一些 Windows Phone 应用程序转换为 Android。这些应用程序都围绕运动跟踪。在 WP7 中,位置观察器有一个“MovementThreshold”属性,用于设置 GPS 需要多少移动才能触发移动事件。通常,我们希望步行时的阈值较低,而在喷气式飞机中的阈值较高。它可以通过这样的代码进行节流,如果速度发生变化,每次我们移动时都会改变它。

        if (mph < 7) watcher.MovementThreshold = 5;
            else if (mph < 15) watcher.MovementThreshold = 20;
            else if (mph < 30) watcher.MovementThreshold = 100;
            else if (mph < 50) watcher.MovementThreshold = 400;
            else if (mph < 100) watcher.MovementThreshold = 800;
            else if (mph < 120) watcher.MovementThreshold = 1200;
            else if (mph < 200) watcher.MovementThreshold = 2400;
            else if (mph < 400) watcher.MovementThreshold = 4800;
            else watcher.MovementThreshold = 9000;

目前在我的应用程序的 Android 版本中,当我的位置服务启动时,我会进行以下调用... locMgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locLstnr);

第三个参数是 minDistance(现在设置为零),听起来很像 WP7 中的 MovementThreshold。

我的第一个问题是:我可以像在 WP7 应用中限制 MovementThreshold 一样在我的 Android 应用中限制 minDistance 吗? 我的第二个问题是:什么样的调用最有效地进行节流? - 我会重复上述 requestLocationUpdates 调用更改 minDistance 参数吗? 谢谢,加里

【问题讨论】:

    标签: android locationmanager


    【解决方案1】:

    我可以像在我的 WP7 应用中限制 MovementThreshold 一样在我的 Android 应用中限制 minDistance 吗?

    恕我直言,不是真的。速度会有所不同,因此您需要持续的 GPS 定位来确定速度,以便您可以调整节流,从而消除节流。特别是,当喷气式飞机降落时,您可能需要一段时间才能发现这一点,因为您正在等待用户先步行(或开车)几公里。

    当然,你在 WP7 中也需要它,所以我不知道你是怎么做到的。

    就我个人而言,我会自己进行过滤,而不是使用minDistance

    什么样的调用最有效地进行节流? - 我是否只需重复上述 requestLocationUpdates 调用更改 minDistance 参数?

    原则上,是的。但是,引用文档:

    minDistance 参数也可以用来控制位置更新的频率。如果它大于 0,那么位置提供程序将仅在位置已更改至少 minDistance 米并且至少 minTime 毫秒已过去时向您的应用程序发送更新。然而,位置提供者使用 minDistance 参数来节省电量更加困难,因此 minTime 应该是节省电池寿命的主要工具。

    (请注意,此处有关minTime 的文档cmets 仅与较新版本的Android 真正相关;Android 1.x/2.x 使用minTime 作为提示,而不是过滤器)

    【讨论】:

      【解决方案2】:

      最有效的节流方法是基于时间。该文档已在另一个答案中被引用,但很明显,设备必须先进行距离测量并对其进行过滤,然后才能计算距离阈值,而时间阈值允许设备避免进行位置测量。

      我鼓励您使用固定时间进行轮询,因此只需设置一次更新。问自己这个问题——“我的应用需要多快知道距离的变化(任何距离)?”如果您可以在其上添加一个数字(1 秒、100 秒等),请将其用作您的更新时间。如果你想避免额外调用你的回调函数,你也可以使用 minDistance。

      请注意,您的阈值已经在“时间”中。您正在计算速度(mph)并且您有一个距离阈值(米,我假设,因为 WP7 中的“MovementThreshold”以米为单位),您可以轻松计算在阈值中移动距离所需的时间(距离 /速度和单位变化的帐户)并将该数字用作您的 minTime,因为您知道该时间之前的任何测量不应大于您的距离阈值,除非设备已改变速度。这为您提供了您正在寻找的滑动比例,但使用更有效的 minTime。

      如果速度发生变化,您的轮询时间将关闭,直到您以新的速度获得第一次读数。我怀疑这对您来说并不重要,因为如果以高分辨率检测这些变化很重要,您可能已经根据时间而不是距离进行轮询。

      【讨论】:

        猜你喜欢
        • 2018-04-13
        • 2011-04-02
        • 2014-05-12
        • 2014-06-26
        • 1970-01-01
        • 2019-03-02
        • 2017-01-05
        • 2015-05-30
        • 1970-01-01
        相关资源
        最近更新 更多