如何使用 Android 地理围栏 API?
Posted
技术标签:
【中文标题】如何使用 Android 地理围栏 API?【英文标题】:How do I use the Android Geofencing API? 【发布时间】:2013-05-22 02:27:18 【问题描述】:我一直在测试新的 Google Play 地理围栏服务 API。
我从android developers site 下载了示例代码。接下来,我在 Android 设备 (Galaxy Note 2) 上运行示例代码。 我将办公室的地理位置和半径设置为10m,但是当我走到办公室时,什么也没发生。
在运行示例代码时,我注意到的一件事是,当我已经在地理围栏范围内,然后将地理围栏添加到 LocationClient
时,没有任何反应。
我已经看过LocationClient
class documentation,发现下面一段:
如果用户禁用了网络位置提供程序,地理围栏服务将停止更新,所有已注册的地理围栏将被删除,并由提供的待处理意图生成意图。在这种情况下,
hasError(Intent)
返回 true,getErrorCode(Intent)
返回GEOFENCE_NOT_AVAILABLE
。"
所以我打开了 WiFi,正走到我的办公室(在地理围栏内),然后我收到了“进入地理围栏”的通知。
我有以下问题:
地理围栏是否仅在启用 WiFi 的情况下工作?
为什么我的 3G 网络提供的位置不起作用?
这是示例代码中的错误吗?
或者这是我的错误?
【问题讨论】:
同样,我已经看到我声明的地理围栏仅在我的设备有 wifi 连接时才有效......如果这是一个错误,那就是一个非常令人不安的问题 我可以在 3g/4g/wifi 上触发地理围栏,但在 3g/4g 上我必须将我的地理围栏半径设置得更大。正如米洛斯所建议的那样是正确的。我也想知道是否有人注意到设置时的延迟时间?进入地理围栏时的滞后......不是即时的。 我现在发现这个示例项目有点混乱。什么是地理围栏1和地理围栏2。为什么我要输入纬度、经度和半径2次?NetworkLocationProvider
不仅仅意味着 wifi,它是 Wifi 和手机信号塔的转义。如果用户关闭了Network Location
,即使 GPS 处于打开状态(根据文档),geofence api 也不起作用,这太糟糕了。
请注意,即使您确实获得了职位,它也可能会被“过滤”,因此不会真正更新。在此线程的其他地方查看我的答案。
【参考方案1】:
如果您只使用蜂窝网络,则定位精度低于 wi-fi 或 gps 的精度(如果您打开谷歌地图,蓝色圆圈是您当前位置的估计 - 如果您只使用 3GP,圆圈半径甚至可以达到数百米)。
最近几天我正在使用地理围栏开发一个应用程序,我发现了以下内容:恕我直言,只有当所有这个“位置估计圈”都在地理围栏半径内时才会触发地理围栏条目,即如果你有 100% 的机会进入地理围栏。所以这取决于你设置的半径有多大。如果您仅设置 10 米,则它可能仅适用于 GPS,而不适用于 3GP。对于 3GP,您必须将半径设置为 1000 米。
【讨论】:
实际上,我所做的测试表明,地理围栏触发器根本不关心准确性,不幸的是,如果我们想要的话,似乎没有任何方法可以设置......在我的情况下具有 800-1500m 精度的 cell-ID 位置足以触发 200m 地理围栏上的进入和离开地理围栏事件..正如您可能猜到的那样,我每 2 分钟就会收到一次进入/离开事件,甚至没有移动..我希望我们对这个 API 的期望有更好的控制和文档记录,因为现在它似乎不是很有用【参考方案2】:Wifi 用于帮助跟踪您的位置。使用 wifi 信号和手机信号对您的位置进行三角测量是一种比让 GPS 持续运行更省电的解决方案。此外,它还可以在 GPS 不支持的情况下工作,例如繁重的多路径区域和室内。
【讨论】:
【参考方案3】:在网络条件下,您必须增加半径至少 1000 M,因为使用网络提供商检索当前位置,它从网络塔附近获取位置。但在 GPS 和 wifi 条件下,它的工作更准确(也有 1 M)。
【讨论】:
当我为开发者提供的地理围栏测试演示应用程序时,它只会在我使用 Wi-Fi 并将半径设置为 1000 M 时发送通知。在其他情况下,如网络、gps 和半径 1 ,10,100MI 测试了它不发送通知。您对此有任何想法吗? 我认为在网络的情况下你应该给半径最小 1000 M,它在 wifi 的情况下对我有用你可以给任何半径,如 1 ,10 ,100。 是的..我可以..但是如果我想在 GPS/2G/3G 开启时收到通知该怎么办?..如果您有任何演示,请分享一下 在 2G/3G 的情况下,将半径最小设置为 1000 M,在开发者网站提供的示例的情况下将起作用【参考方案4】:我想我会在这里分享我的结果。我也开发了一个实现 Google Play Services Location API 和 Geofence API 的实验室应用程序。我的结果表明,定位代码具有一种病态的无法承认错误的能力。 :)
当按下按钮时,我的应用会在位置 API 返回的当前位置(“curLoc”)创建一个半径为 30 米的地理围栏。在屏幕上,我通过调用 curLoc.distanceTo(fenceLoc) 并大致每秒更新一次来显示到地理围栏中心的距离(“distToCenter”)。
我启动应用程序并等待精度稳定(通常为 10.0 米),然后按下按钮创建围栏。我立即收到“进入”事件。我清除了事件并去散步,显然进入了时空异常。我走下街区,绕过拐角,distToCenter 值只增加了大约 4 米。我走得更远,直到我离我家大约 300 米(通过计算步数来判断)并且 dstToCenter 逐渐增加。地理围栏退出事件最终在 dstToCenter 超过 30 米后大约 20 秒触发。
我等着看距离稳定在哪里,大约是 150 米左右。我转身回家,同样的极端位置滞后发生了。我在我的办公桌前坐下,而我的虫洞自我仍在大约 90 米之外。大约 40 秒后,我的分身进入栅栏内,大约 20 秒后,我得到了进入事件。
此时我仍然在前面人行道上的某个地方(7.4 米远),慢慢地走向前门。
注意:尽管我确实看到 GPS 状态栏图标在我失去与 WiFi 的连接后闪烁了几秒钟,但源始终是“融合”的。更重要的是,精度从 10.0 米起从未动摇。
骗子!
:)
【讨论】:
【参考方案5】:我测试了示例地理围栏应用程序,如果 WiFi 处于关闭状态,它不会在低于 Android 4.3 的版本上检测到地理围栏事件。
即使 WiFi 关闭,Android 4.3 及更高版本也能正常工作。
【讨论】:
以上是关于如何使用 Android 地理围栏 API?的主要内容,如果未能解决你的问题,请参考以下文章