在打开另一个 GPS 应用程序之前,地理围栏随机无法触发

Posted

技术标签:

【中文标题】在打开另一个 GPS 应用程序之前,地理围栏随机无法触发【英文标题】:Geofences randomly fail to trigger until another GPS app is opened 【发布时间】:2018-12-18 06:56:08 【问题描述】:

几个月来,我一直在测试一个应用程序,它使用 android 地理围栏 API 来跟踪进入/退出事件。大约 99% 的时间它都能完美运行,但有时地理围栏根本不会触发。

不能是我的应用程序未能保持地理围栏加载导致的问题,因为每当围栏未能触发时,打开一个完全独立的 GPS 应用程序,即谷歌地图,会立即导致我的应用程序触发了它未能触发的地理围栏事件。

我正在通过广播接收器在 BOOT_COMPLETED 和 location.PROVIDER_CHANGED 上处理栅栏的重新加载。 围栏半径相当大,超过 1 英里。 应用没有进入睡眠或电源管理状态。 用户和个人测试表明,这绝不是因为位置服务被手动禁用。 没有停顿,围栏永不过期。

正如我所说,地理围栏在 99% 的情况下都能完美运行,而另外 1% 的人只需打开另一个 gps 应用程序就会立即触发围栏。我正试图弄清楚我能做些什么来消除失败的 1%,希望没有持续轮询位置(这使得地理围栏 api 无论如何都毫无意义)。

更新:(有限的测试样本大小为 1)在运行 Android Oreo 的设备上,这个问题似乎已经恶化到地理围栏永远不会触发的地步,除非启动辅助 gps 应用程序......

【问题讨论】:

【参考方案1】:

我不知道这是否会对任何人有所帮助,但由于从 Android O 开始的背景限制,地理围栏会按照您的描述工作,只有打开获取用户当前位置的应用才会触发地理围栏。

您可以创建一个前台服务并从 Fused Location Provider 轮询位置,以使地理围栏真正起作用。

我希望其他人找到更好的解决方案。

【讨论】:

你能分享一个示例代码吗?即使应用程序被杀死(活动被刷走),我也试图接收地理围栏触发器。我正在使用 BroadcastReceiver 方法,使用 PendingIntent.getBroadcast 但它仅在应用程序在后台(未终止)时才有效。如果它被杀死了,它只有在我打开其他应用程序(例如 Google 地图)时才会起作用。

以上是关于在打开另一个 GPS 应用程序之前,地理围栏随机无法触发的主要内容,如果未能解决你的问题,请参考以下文章

Android 地理围栏仅适用于打开的应用程序

Android 地理围栏仅适用于打开的应用程序

仅使用 gps 定位模式的 Android 地理围栏监控

地理围栏 - 触发“GEOFENCE_NOT_AVAILABLE”的问题

什么是 “地理围栏”?

如何使地理围栏准确?