即使在获得位置后,GPS 也一直在工作

Posted

技术标签:

【中文标题】即使在获得位置后,GPS 也一直在工作【英文标题】:GPS is working the whole time even after getting a location 【发布时间】:2012-05-31 15:48:18 【问题描述】:

我正在开发一个使用 gps 的应用程序,该应用程序在应用程序投入使用之前一直运行。我的 GPS 在 5 分钟后唤醒并获取位置,然后它的符号停止闪烁并在几乎所有设备(Sony xperia、Samsung tab、Htc WildFire、Motorola photon)中不可见,但在 Motorola Defy 和 Samsung Ace 中不可见,它们会消耗大量电池电量. GPS得到修复并始终保持稳定和可见。这些设备(Moto Defy 和三星 Ace)的 GPS 工作方式不同。看我的代码:

long _listenerWakeUpTimeInterval=1000*60*5;**  //5 minutes
_locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, _listenerWakeUpTimeInterval, 300, locationListener);

所有设备的 GPS 会在 5 分钟后唤醒,但这两款设备(Moto Defy 和三星 Ace)的 GPS 每 300 米调用一次onLocationChanged(Location loc) 方法。对于这两种设备来说,时间并不重要。当我快速(在汽车中)旅行时,这个距离在几分钟(1 或 2 分钟)内完成。所以我接到了onLocationChanged(Location loc) 方法的电话。在这些设备中,GPS 始终是固定的、静态的和可见的。我不想每次 GPS 得到修复时都调用 locationManager.removesupdates 方法。我只在服务的onDestroy() 中调用此方法。那么请说明为什么这两款设备的 GPS 与其他设备的行为不同,以及如何解决这个问题?

【问题讨论】:

【参考方案1】:

如果您阅读the docs,它会说:

minTime:通知的最小时间间隔,以毫秒为单位。此字段仅用作省电提示,位置更新之间的实际时间可能大于或小于此值。

所以这只是一个建议,实现可以忽略它。

我的建议是使用 AlertManager 每 5 分钟安排一次服务,然后在服务负载中,调用 requestSingleUpdate 请求单个修复。这将节省电池。缺点是 GPS 芯片需要一些时间才能接收到卫星信号,在良好条件下大约需要 30 秒到 1 分钟(首次定位时间,或 TTFF)。在处理完所有待处理的请求后,它又变冷了。所以在下一次服务执行中,我猜 TTFF 可能会和上一次迭代一样高。 (除非你使用NETWORK_PROVIDER,但那样准确率会更低)。

【讨论】:

【参考方案2】:

我得到了这个问题的解决方案。我使用AlarmManager(每5分钟后重复警报)注册gps,然后运行我的gps 30秒并取消注册gps。如果我接到onLocationChanged(Location loc)的电话,那么我在此方法中取消注册 Gps。否则(如果我没有获得新位置)我在 30 秒后通过处理程序取消注册 Gps。当我再次需要 Gps 时,我遵循相同的过程。通过这种方式,我的 Gps 最多工作 30 秒而不是整个距离服务运行的时间。

【讨论】:

以上是关于即使在获得位置后,GPS 也一直在工作的主要内容,如果未能解决你的问题,请参考以下文章

Android GPS 无法获取我的位置

在 iPhone 的 GPS 上获取错误的位置

如何使用谷歌地图 Api 获得最精确的位置 [重复]

Android GPS 位置与其他 GPS 设备

为啥我在同一位置获得不同的 GPS 点

为啥 html5 地理位置无法获得结果?