LocationManager minDistance设置问题

时间:2012-12-14 19:14:59

标签: android locationmanager

[我知道这与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。

我的第一个问题是:我可以在我的Android应用程序中扼制minDistance,就像我在WP7应用程序中限制MovementThreshold一样吗? 我的第二个问题是:什么样的电话最有效率? - 我会重复上面的requestLocationUpdates调用更改minDistance参数吗? 谢谢,加里

2 个答案:

答案 0 :(得分:0)

  

我是否可以在我的Android应用程序中限制minDistance,就像我在WP7应用程序中限制MovementThreshold一样?

恕我直言,不是真的。速度各不相同,因此您需要连续的GPS定位来确定速度,以便您可以调整节流,从而阻止节流。特别是当喷气式飞机降落时,你需要一段时间才能找到它,因为你正在等待用户首先步行几公里(或汽车)。

当然,你也需要在WP7中使用它,所以我不知道你是怎么把它拉到那里的。

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

  

什么样的电话最有效率? - 我会重复上面的requestLocationUpdates调用更改minDistance参数吗?

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

  

minDistance参数还可用于控制位置更新的频率。如果它大于0,那么位置提供程序将仅在位置至少改变minDistance米时向您的应用程序发送更新,并且至少已经过了minTime毫秒。但是,位置提供商使用minDistance参数更难以节省功耗,因此minTime应该是节省电池寿命的主要工具。

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

答案 1 :(得分:0)

最有效的方法是根据时间节流。文档已在另一个答案中引用,但显而易见的是,设备必须在到达您计算距离阈值之前进行距离测量并对其进行过滤,而时间阈值允许设备避免进行位置测量。

我建议您使用固定时间进行轮询,因此只需要将更新设置一次。问自己这个问题 - “我的应用程序需要多快了解距离的变化(任何距离)?”如果您可以在其上放置一个数字(1秒,100秒,无论如何),请将其用作更新时间。如果你想避免额外调用你的回调函数,你也可以使用minDistance。

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

如果速度发生变化,您的轮询时间将会关闭,直到您以新的速度首次阅读。我怀疑这对你没关系,因为如果以高分辨率检测这些变化很重要,你可能已经根据时间而不是距离进行轮询。