地理围栏——触发“GEOFENCE_NOT_AVAILABLE”问题

3

我正在使用地理围栏应用,并且自从开始使用以来,我可以通过广播接收器接收到位置转换信息。当我关闭GPS定位时,我会收到一个代码为GEOFENCE_NOT_AVAILABLE的警报,然后我启动了一个服务以便在我重新打开GPS时重新注册地理围栏。 现在我休息了几天,但是当我关闭GPS时,广播接收器突然没有收到任何警报了。我不明白为什么? * 当我进入/退出某个位置(如我在地理围栏中定义的)时触发警报,在触发GEOFENCE_NOT_AVAILABLE警报时才有问题。

如果有人能帮助我解决这个问题,我会很高兴。


1
我注意到了同样的问题。我已经使用地理围栏几年了。历史上,每当用户关闭他们的位置服务时,我的Geofence BroadcastReceiver就会触发GEOFENCE_NOT_AVAILABLE意图,我就知道他们的位置已被禁用。但现在我不再收到这个意图了,而且我没有改变任何代码。内部肯定有些变化,但文档仍然建议我应该收到这个意图。我将研究提交一个带有重现问题的repo的错误报告到问题跟踪器中。 - Stephen Ruda
@StephenRuda 你是否已经向Google提出了这个问题?这个问题在Android 11上变得非常严重 - 没有一个Android 11设备能够接收到GEOFENCE_NOT_AVAILABLE事件,这最终会破坏所有地理围栏。 - NoHarmDan
@NoHarmDan 希望我还记得一切。我得出的结论是,这实际上是新版 Google Play 服务更新中的一个“功能”。最初,如果您收到 GEOFENCE_NOT_AVAILABLE 意图,则表示 Geofences 已注销,因为位置已禁用。从我在安装了较新版本 Google Play 服务的设备上进行的测试来看,它不会发送 GEOFENCE_NOT_AVAILABLE 意图,因为它实际上并没有注销您的 Geofences。如果您重新打开位置服务,则应该可以正常工作。 - Stephen Ruda
3个回答

0

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

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

尚未提供有关如何在运行Android 10或更早版本的设备上发生此情况的相关信息,一些开发人员也报告了此问题。但是,似乎可以安全地假设该更改至少在某些Android OS版本中引入了(取决于设备制造商)。如果原始问题提到此问题是否仅适用于某些API,那将非常有帮助,但我想由于其年龄,它并不涉及Android 11。如果遇到此问题的低级API的任何人都可以测试他们的旧地理围栏是否保持注册和可用,我将很乐意相应地更新答案。

Source: https://issuetracker.google.com/issues/143967408

更新: 正如Stephen Ruda所提到的,这似乎不取决于Android操作系统版本,而是取决于Google Play服务版本。这使得这种行为完全不可预测。


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

0
当应用程序没有被授予精确位置权限时,我们会收到GEOFENCE_NOT_AVAILABLE错误。 请检查以下选项是否已启用,这里我是指Android 13操作系统:
  1. 设置->应用->YourApp->权限->位置->使用精确定位(打开此选项)
  2. 设置->位置->位置服务->Google位置准确性(打开此选项)
这应该可以解决GEOFENCE_NOT_AVAILABLE错误。

-1

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

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

触发器未发生的几个原因:

  1. 检查您在地理围栏请求中设置的到期时间戳是否仍然有效。
  2. 您的设备是否重新启动?如果是,则需要重新注册围栏。(请参阅文档:仅在需要时重新注册地理围栏文档

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

  4. 当您重新注册围栏时,应先注销它们,然后才能重新注册。

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


我尝试了你所说的一切,我在地理围栏中定义了NEVER_EXPIRE,并且GPS的所有设置都是应该的。问题是由于某种原因,系统在我进入/退出保存的位置时发出警报,但在关闭GPS提供程序时没有警报。我还尝试重新构建项目,删除应用程序并重新注册broadcastReceiver类,但仍然无法正常工作。 - Yehonatan Rozenberg
所以基本上,你的问题是你没有收到警报(GEOFENCE_NOT_AVAILABLE)?如果你只想获取位置适配器的状态,请尝试这个链接(https://dev59.com/G3RA5IYBdhLWcg3wvgob)。 - Mayuri Khinvasara
我需要进入/退出警报和GPS位置状态。而且我需要它在后台运行,所以链接中的内容对我的情况不好。 - Yehonatan Rozenberg
从技术上讲,我通过注册ACTION_PROVIDER_CHANGED广播接收器的无限服务来解决了问题,因此当我更改GPS状态时会收到警报,但这不是我想要的理想解决方案,因为我想在收到GEOFENCE_NOT_AVAILABLE警报时启动该服务,但是这个警报没有被调用。 - Yehonatan Rozenberg
这个回答根本没有回答问题。的确,这个问题并不是完美的形式,但它谈论的是GEOFENCE_NOT_AVAILABLE事件未被传递的问题,而不是当它被传递时意味着什么。 - NoHarmDan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接