Android 地理围栏示例代码中的错误?有人可以确认吗?

Posted

技术标签:

【中文标题】Android 地理围栏示例代码中的错误?有人可以确认吗?【英文标题】:Bug in Android Geofence Sample code? Can anyone please confirm? 【发布时间】:2013-05-18 19:29:29 【问题描述】:

我不确定这是否是 新的 Android GeoFence 示例代码错误,或者我对它应该做什么的理解是错误的。示例应用程序创建地理围栏,但在地理围栏被破坏时不会发出警报。如果有人想尝试并确认,您可以从这里下载示例代码:

https://developer.android.com/training/location/geofencing.html

这是我期望示例应用程序做的事情:

设置 2 个不同的地理围栏。就我而言,我选择了每英里 2 分 通过输入各自的纬度/经度。我也设置了半径 到 250m。 我一个接一个地开车去这两个地方 我假设会弹出一个通知,表明地理围栏 已被破坏。

在这种情况下,未注册任何通知或任何日志消息,这意味着从未调用过“ReceiveTransitionsIntentService”。一个观察结果是,当我开车到第一个位置,然后在该位置添加一个新的地理围栏,通知会立即触发,但任何其他位置(地理围栏)我设置并开车去,没有任何反应。

知道为什么吗?我对示例应用功能的理解是否正确?

除了示例代码中的内容之外,我是否需要执行任何其他操作才能在驾驶时违反地理围栏时收到警报? 地理围栏监控是否与创建地理围栏分开,我在这里缺少什么?

非常感谢任何意见,我们非常渴望在我们的应用中使用它,但现在我们陷入了困境。

谢谢, 托里。

【问题讨论】:

我也遇到了同样的问题 - 我只收到用户正在进入地理围栏的通知(在创建时)。之后没有任何反应——退出或重新进入地理围栏。 Torri - 您找到解决此问题的方法了吗?我一直在开发一个示例应用程序,通过将 Geofence 示例与新的 Location API(融合位置提供程序)合并并刷新用户位置,我已经能够(在大多数情况下)获得正确的进入/退出转换发生。在后台运行/应用程序未打开时它不足,但在打开时,它大约有 90% 的位置,甚至在没有 wifi 或蜂窝覆盖的情况下低至 10 米。如果您仍然有问题,我可以与您分享我的示例代码。 @Kyle - 我遇到了和 Torri 一样的问题。请您分享您的工作代码吗? @nitishpatel-试试看-github.com/kyleparker/geofencesample。使用示例应用程序构建,我添加了一个内容提供程序、谷歌地图、编辑器。使用“我的位置”图标触发地理围栏事件。获取此基本代码并提取到使用 MyTracks 应用程序中的代码/功能的现有应用程序中。记录路径时,它会频繁更新位置,进而触发地理围栏事件。它在 99% 的时间内都能以良好的准确度工作。顺便说一句,这有很多额外的、不必要的代码——正在测试一些不同的东西——后来没有清理干净。使用风险自负:) 这是因为新的Geofencing Api很少使用GPS。我认为实现它是没有用的。 【参考方案1】:

首先,您对应用功能的理解是正确的。每当您进入/离开其中一个地理围栏时,它都会在通知中向您显示(顺便说一句,它总是更新相同的通知,因此请留意它,否则您可能会错过其中一个事件)。

其次,要小心,因为默认情况下,地理围栏 1 只会触发 ENTER 事件。因此,如果您在进入该地理围栏区域后离开该区域,您将不会收到通知!您可以在 MainActivity.java 上创建 mUIGeofence1 对象时更改此行为。

最后,与所有与位置相关的事情一样,这个 API 并不完美。从我的测试至今,我从未见过它启动 GPS,所以当在外面时,它似乎几乎依赖于网络位置,它可以即使您正站在半径 500m 的地理围栏中间,也不会轻易落入地理围栏之下。在 IO 的一次演讲中,Reto Meier 提到该 API 足够聪明,可以以最佳方式处理电池消耗,因此它只会在用户开始接近地理围栏时打开 GPS——这是有道理的——但这不幸的是,似乎永远不会发生。

【讨论】:

会话中肯定有一些虚假广告...因为正如您提到的,gps 从未被激活,这实际上没有意义... API 看起来很有希望并且可用但似乎仍然存在有很多错误。你先生得到+1,因为提到栅栏上只有Geofence.GEOFENCE_TRANSITION_ENTER,这让我疯狂了半个小时...... it would only turn on GPS when the user starts getting close to a geofence 就目前的实现而言,这种情况 从不 似乎是真的,因为它不断从 wifi+cell 塔获取位置,太多不准确。【参考方案2】:

API 永远不会“开启”GPS。您必须自己启动 GPS。

【讨论】:

我确实打开了 gps、wifi、4g,但示例代码没有发出通知。任何人都可以尝试一下,因为可以免费下载示例代码。如果您能尝试一下,如果示例代码中确实存在错误,我将不胜感激。 你有证据吗?根据@Rick 的回答,API 应该在用户接近地理围栏时打开 GPS,这已由 I/O 的 Reto Meier 确认。我并不是说它可以正常工作(!),但您的回答暗示您认为这不是 API 的预期行为。【参考方案3】:

还要确保您已将半径设置得足够大。我建议将其设置为 1000 只是为了看看它是否有效。我还在玩它,但这里的示例代码确实可以正常工作:

How do I use the Android Geofencing API?

【讨论】:

我将它设置为 1000 并且它有效。我可以知道它在哪个单位工作吗?我的意思是米或公里或英里?【参考方案4】:

一开始我也是这么想的。这是因为半径以米为单位,我认为它会以公里/英里为单位。所以我输入了非常小的值。然后经过几次实验,我发现了这一点。输入更大的值,它在我的 Nexus 5 上就像魅力一样

【讨论】:

【参考方案5】:

我尝试了 GeofenceDetection 示例代码,它正在工作。 我只使用 Wifi 和 GPS,并将我的半径设置为 15 米。 当我走到该地区时,它不会立即显示通知。 几秒钟后,我收到了“进入”通知。 此外,即使我在该地区静止不动,有时我也会收到通知 我正在退出该地区。它让应用感觉像是在一个区域进进出出。

【讨论】:

【参考方案6】:

我编写了一个同时使用 Google Play 服务位置和地理围栏 API 的测试应用。我使用位置 API 以 1 秒的速度获取当前位置。当我设置我的地理围栏时,我会显示从当前位置到地理围栏中心的距离,并在位置更新时更新。

在设置地理围栏后,我立即收到了 entry 事件。我清除了该事件并在地理围栏半径之外散步。显示的距离疯狂地滞后。这个位置花了大约三分钟才赶上我。在回家的路上也发生了类似的滞后。

Pity Play Services 是封闭源代码,我很想了解他们算法的局限性。

【讨论】:

以上是关于Android 地理围栏示例代码中的错误?有人可以确认吗?的主要内容,如果未能解决你的问题,请参考以下文章

新的 Android 地理围栏 API - 示例代码在位置时不会发出警报/通知

如何使用 Android 地理围栏 API?

在后台广播的工作地理围栏示例

如何在 Android 中创建地理围栏?

地理围栏(Android 示例应用程序)java.lang.ClassNotFoundException MainActivity

Android 地理围栏在进入/退出时触发,没有错误但没有 GEOFENCE_TRANSITION_ 标志