谷歌地图(安卓)如何如此高效地请求 GPS 修复如此频繁
Posted
技术标签:
【中文标题】谷歌地图(安卓)如何如此高效地请求 GPS 修复如此频繁【英文标题】:How can Google Maps (android) be so efficient requesting GPS fixes so often 【发布时间】:2016-08-03 18:57:45 【问题描述】:我一直在为 android 开发一个跟踪应用程序,在该应用程序中我需要经常使用 GPS 定位来跟踪一个人(最多 10 秒间隔)。
事实证明,几分钟后,我的手机警告了一个耗电应用 - 我的应用。
虽然我知道 GPS 修复会消耗大量电池,但如何在没有耗尽电池的情况下使用 Google 地图跟踪一个多小时,并且仍然可以立即修复 GPS 更改?
非常感谢。
这是我在做什么的一个想法:
// Define a listener that responds to location updates
LocationListener locationListener = new LocationListener()
public void onLocationChanged(Location location)
// Called when a new location is found by the network location provider.
makeUseOfNewLocation(location);
public void onStatusChanged(String provider, int status, Bundle extras)
public void onProviderEnabled(String provider)
public void onProviderDisabled(String provider)
;
// Register the listener with the Location Manager to receive location updates
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 0, locationListener);
这几乎就是我整个代码中的电池消耗。
【问题讨论】:
【参考方案1】:你还有其他事情发生。 GPS不会消耗那么多电池。你可以让它在后台运行一整天,它占用的时间比手机的收音机少。当您使用 GPS 并保持屏幕打开时,手机会耗尽电量。或者,当您不断将位置发送到服务器时——始终保持网络无线电开启会消耗大量电池。但 GPS 本身相当便宜。
另外,每 10 秒跟踪每个人是没有意义的。 GPS 更新速度也没有那么快。
除了发布您的代码可能会有所帮助之外,我们还可以查看您是否在做一些愚蠢的事情。
【讨论】:
每隔 10 秒跟踪每个人并非毫无意义。这是很常见的。对于消费领域的某些用例,即使是 1Hz 的跟踪也是现实的 @j3App 不,这完全没有意义。即使您有一个需要这种精度水平的用例(您不需要),以步行速度的人甚至不会在 10 秒内超出初始读数的精度范围。它之所以常见是因为无知,而不是因为它是个好主意。 我认为没有人提到步行速度。例如在100km/h,一个人每秒移动28米,也就是10秒280m。而如果你只想考虑步行,你可以轻松步行2m/s(大约7km/h)。同样,这将在 10 秒内达到 20m,而 GPS 比这更准确。 @j3App 如果您正在谈论您正在驾驶的速度,并且需要的准确度更低。汽车只是没有改变路线和方向,不足以让 10 秒值得。假设航向和航向并减少检查频率。 是否有价值取决于您想要达到的目标。有大量的用例受益于 10 秒或更短的采样率。现在让我们继续【参考方案2】:“如何在没有耗尽电池的情况下使用谷歌地图跟踪一个多小时,并且仍然可以立即修复 GPS 变化”
首先,当我使用 Google 地图的路线指示时,我的手机会变成一个小加热器。 %电池像石头一样掉下来。
以下是一些建议:
-
处于活动 (C0) 状态的 CPU 是最大的能源消耗者。节省能源的最佳方法是让 CPU 保持足够长的不活动时间,使其进入低能源使用状态 (>C0)。
位置更新周期越长,CPU 和其他外围设备使用的能量就越少。这是因为,您再次允许它们进入能量守恒状态。
考虑外推。我确信谷歌地图和其他此类软件可以做到这一点。因此,如果您每 30 秒更新一次,您可以从之前的点推断位置。如果你真的想聪明一点,你可以查看你的仓位历史来进行变量更新。
正如 Gabe 所说,您的代码中似乎存在错误,导致 CPU 和/或 WiFi-GPS 始终处于活动状态。有一些 Android API 可以让外围设备保持打开状态,而另一些则不会做同样的事情。当然,应始终避免轮询。
这是我不久前回答的discusses energy usage。
祝你好运。
【讨论】:
#2 是正确的。如果您每 10 毫秒更新一次,处理器将不会因为试图最小化延迟而进入更高的 C 状态。设备也有电源 D 状态。如果改为使用 1 秒,则处理器可能会进入更低效率的 C 状态。见我的performance article。 #3:我不能声称直接了解外推,但不敢相信他们不会为设计良好的应用程序进行线性外推。以上是关于谷歌地图(安卓)如何如此高效地请求 GPS 修复如此频繁的主要内容,如果未能解决你的问题,请参考以下文章