3

我正在寻找位置感知通知的最佳技术。

我的第一次尝试是使用 LocationManager 的 addProximityAlert,但它需要 ACCESS_FINE_LOCATION(COARSE_LOCATION 给我一个 SecurityException)并保持 GPS 始终打开和激活(至少在 Jelly Bean 上),这会很快耗尽电池。当屏幕处于睡眠状态( addProximityAlert)时,它似乎也不尊重每 4 分钟一次的检查。

我正在考虑使用 PASSIVE_PROVIDER 来收集其他应用程序的位置信息,并且可能每隔一段时间使用一项服务来询问 COARSE_LOCATION(比如在屏幕关闭时每 4 分钟一次,并且在屏幕打开时更频繁地设备已插入)。

要求是当用户靠近某些位置时,应用程序将触发通知。

任何人已经实施或有建议以有效且电池效率高的方式实施这一点?

4

2 回答 2

4

我构建了这样一个应用程序(因此我在办公时间问答中提出了关于如何测量 LocationManager 的功耗的问题),同时它运行得非常好。我最初打算使用内置的接近警报,但在与您相同的问题上苦苦挣扎,并认为它不够灵活。

相反,我构建了一个服务,该服务使用 LocationProvider 每五分钟使用 NETWORK_PROVIDER 轮询一次位置,计算到所需位置的距离,如果在附近,则触发通知。在拥有大量 Wifi 网络的城市中,这给了我 50 米的(报告的)精度。

我还使用 PASSIVE_PROVIDER 从其他应用程序的位置请求中受益。

如果我在所需位置附近并且报告的精度太粗略而无法确定我是否在指定的接近范围内,我将使用单个 GPS 位置请求作为备份。如果 NETWORK_PROVIDER 超时,我也会使用单个 GPS 位置请求。为了不让 GPS 提供商在我使用地铁时耗尽电池电量,它还有一个带有指数退避的超时。

当我连接到 Wifi 网络时,我假设我没有移动,并在此期间禁用位置提供程序。

我所做的最后一个更改是为 NETWORK_PROVIDER 使用 15 分钟(“不精确重复”)计时器,如果我可以确定我将无法在 15 分钟内到达任何已保存的位置(因此以 5 分钟间隔轮询)没有意义)。这有助于节省电力。

我正在考虑使用更长的时间间隔来节省更多的电量,但是在这里找到一个启发式方法来确定我是否能够在那个时间内到达我保存的位置之一并不容易,因为我不能总是假设相同的行驶速度(步行、乘火车或汽车旅行)。但是由于我无法测量由我的应用程序引起的 LocationManager 的功耗,我不知道如何评估日常场景中的功耗。

我不介意内置 API 是否会提供所有这些逻辑,但我得出的结论是它没有,所以我自己构建了这个。

希望这对您有所帮助。

于 2012-08-22T22:34:59.073 回答
0

我正在使用以下库来执行此操作。https://code.google.com/p/little-fluffy-location-library/

它易于使用,但并没有提供太大的灵活性。例如,您不能即时更改更新频率。但是它的源是可用的,你可以转换它。

于 2012-08-22T22:46:54.073 回答