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

Posted

技术标签:

【中文标题】地理围栏 - 触发“GEOFENCE_NOT_AVAILABLE”的问题【英文标题】:Geofence - problem in triggering 'GEOFENCE_NOT_AVAILABLE' 【发布时间】:2019-12-16 05:56:12 【问题描述】:

我使用地理围栏使用应用程序,自从我开始使用它以来,我开始使用它来广播接收器,当我关闭 GPS 位置时,我收到了一个带有代码 GEOFENCE_NOT_AVAILABLE 的警报,我启动了一项服务来重新注册地理围栏打开 GPS。 现在我休息了几天,突然我的广播接收器在我关闭 GPS 时没有收到警报。我不明白为什么? *当我进入/退出位置时(就像我在地理围栏初始化中定义的那样)我触发警报,问题只是触发 GEOFENCE_NOT_AVAILABLE 警报。

如果有人可以帮助我,我会很高兴

【问题讨论】:

我注意到了同样的问题。我已经使用地理围栏好几年了。从历史上看,每当用户关闭他们的位置服务时,我的 Geofence BroadcastReceiver 都会触发 GEOFENCE_NOT_AVAILABLE 意图,我会知道他们的位置已被禁用。我不再有这个意图,也没有更改任何代码。内部肯定发生了一些变化,但文档仍然建议我应该明白这个意图。我会考虑向问题跟踪器提交一份错误报告,并附上一个重现问题的仓库。 @StephenRuda 您是否对 Google 提出了问题?这个问题在 android 11 中变得很严重 - 没有一个 Android 11 设备接收到最终破坏所有地理围栏的 GEOFENCE_NOT_AVAILABLE 事件。 @NoHarmDan 已经很久了,希望我能正确记住所有内容。我得出的结论是,它实际上是更新的 Google Play 服务更新中的一个“功能”。最初,如果您获得 GEOFENCE_NOT_AVAILABLE 意图,它会让您知道地理围栏已被取消注册,因为位置已被禁用。根据我在安装了较新版本的 Google Play 服务的设备上的测试,它不会向您发送 GEOFENCE_NOT_AVAILABLE 意图,因为它实际上并没有取消注册您的地理围栏。如果您重新打开定位服务,它们应该会开始工作。 【参考方案1】:

对于在 Android 11(API 30,即使在构建时针对 API 29 或更低版本)运行应用程序时遇到此问题的任何人,已确认这是预期行为,因为 Android 操作系统在开启位置服务时不再取消注册地理围栏关闭。

但是,当位置服务关闭时,您仍然无法注册地理围栏,因此必须检查其可用性,并在需要注册新地理围栏时提示用户打开它们。以前注册的不需要重新注册。

没有提供有关如何在运行 Android 10 或更早版本的设备上发生这种情况的相关信息,一些开发人员也报告了这一点。但可以肯定的是,至少在某些版本的 Android 操作系统中(取决于设备制造商)早先引入了这种变化。如果最初的问题提到此问题是否仅在某些 API 上会非常有帮助,但我想由于它的年龄,它与 Android 11 无关。如果在较低 API 上遇到此问题的任何人都可以测试他们的旧的地理围栏仍然注册并可用,我很乐意相应地更新答案。

来源: https://issuetracker.google.com/issues/143967408

更新: 正如 Stephen Ruda 所提到的,它似乎不依赖于 Android OS 版本,而是依赖于 Google Play Services 版本。这使得这种行为完全不可预测。

【讨论】:

对不起,我没有看到这个答案。我对您对原始问题的评论发表了回复。根据我所做的测试,我确定它是基于设备本身运行的 Google Play 服务版本。在 2019 年末的某个时候,Google Play 服务更新改变了这种行为。如果您的设备正在运行包含此更新的现代版 Google Play 服务,则您不应获得 GEOFENCE_NOT_AVAILABLE 意图。运行旧版本的设备仍然会得到意图。几乎我所有的应用用户都在运行这个新版本。 感谢您的更新。太棒了,谷歌干得好,一如既往...随机破坏事物的方式... 我完全赞成改变。这对我们开发人员来说很烦人,因为有两组不同的行为,但最终新行为会更好,因为您不必担心自己重新注册地理围栏。我的代码中仍然有处理 GEOFENCE_NOT_AVAILABLE 意图的逻辑,并且它被设置为在它发生时向我们发送通知。最初,我们收到了很多关于它发生的通知,但我们很少再收到它们了。自 Google Play 服务更新发布以来已经有大约 2 年的时间了。我们 99% 以上的用户都有更新的行为。 哦,不要误会我的意思,考虑到重新创建地理围栏部分,这太棒了。但是谷歌(像往常一样)没有想到的是,依赖于这个事件的应用程序中可能还有其他相关功能......【参考方案2】:

GEOFENCE_NOT_AVAILABLE 是预期的错误代码,让您知道位置适配器已关闭并且位置(和地理围栏)将不再被跟踪。

一旦再次可用,您的地理围栏将处于活动状态,您将获得所需的回调。

触发器没有发生的几个原因:

    检查您在地理围栏请求中设置的过期时间戳是否仍然有效。

    您的设备是否已重新启动?如果是,您需要重新注册围栏。 (参考文档:Re-register geofences only when required documentation)

    您的位置是否在设备设置中设置为高精度模式?

    重新注册围栏时,应先取消注册,然后再重新注册。

    打开 Google 地图并检查其显示的位置是否正确。

【讨论】:

我尝试了你所说的一切,我在地理围栏中定义了 NEVER_EXPIRE 并且 GPS 的所有设置都是应该的。问题是由于某种原因,系统会在我进入/退出保存的位置时发出警报,但在我关闭 GPS 提供程序时不会发出警报。我也尝试重建项目,删除应用程序并重新注册广播接收器类,但仍然无法正常工作。 所以基本上,您的问题是您没有收到警报 (GEOFENCE_NOT_AVAILABLE)?如果你特别想要位置适配器的状态,试试这个 (***.com/questions/843675/…) 我需要进入/退出警报和 GPS 位置的状态。而且我在后台需要它,所以链接中的内容对我的情况不利。 从技术上讲,我解决了注册 ACTION_PROVIDER_CHANGED 广播接收器的永无止境服务的问题,因此当我更改 GPS 的状态时,我会收到警报,但这不是我想要的理想解决方案,因为我想启动该服务当我收到 GEOFENCE_NOT_AVAILABLE 警报并且未调用此警报时。 这个答案根本没有回答这个问题。这个问题并不完美,没错,但它谈论的是 GEOFENCE_NOT_AVAILABLE 事件没有被传递的问题,而不是它的含义。

以上是关于地理围栏 - 触发“GEOFENCE_NOT_AVAILABLE”的问题的主要内容,如果未能解决你的问题,请参考以下文章

应用程序在后台时未触发地理围栏通知

地理围栏有效,但一段时间后停止触发

未触发 Android 地理围栏广播接收器

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

在后台某个时间后未触发Android地理围栏?

在后台应用程序时不会触发地理围栏通知