地理围栏无法按预期工作

Posted

技术标签:

【中文标题】地理围栏无法按预期工作【英文标题】:Geofences do not work as expected 【发布时间】:2015-03-22 21:11:05 【问题描述】:

github 上的Creating and Monitoring Geofences example app 无法正常工作,Google Play 服务中的地理围栏似乎无法正常工作。

我在 Stack Overflow 的其他地方读到,Reto Meier 在 Google IO 上提到,只有当手机接近地理围栏以节省电池时,GPS 才会打开。 好像根本打不开。

情况如下:

我有一个带有 Google API 的模拟器(真手机也是如此)。 我已经安装了上面提到的开箱即用的应用程序并添加了地理围栏。 我有一个 KML 文件,可以驱使我进出地理围栏。

Gofence ENTER 被触发。

现在,为了确保 KML 确实有效,我打开了 Google 地图。我玩 KML,我可以看到蓝色的“你在这里”点很好地进出地理围栏,并且地理围栏确实被触发了。

当 Google 地图启动并运行时,我在状态栏中看到 GPS 指示器。

因此,在我看来,只有当 GPS 明确打开时才会触发 Goefence。

有人可以解释一下吗? Stack Overflow 上有很多关于相同问题的问题。

谢谢。

编辑: 用真机做了实地测试。当Location Updates 应用程序正在运行并跟踪我时,Creating and Monitoring Geofences example app 正在收到 ENTER/EXIT 事件。我一杀死位置更新应用,地理围栏应用就停止接收 ENTER/EXIT 事件。

在我看来,Google 已将地理围栏的功耗优化到了无用的地步。

【问题讨论】:

【参考方案1】:

我找到了解决方案。这是一种滥用,但这是让地理围栏有用的唯一方法。

我需要做的就是请求位置更新:

mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(10000);
mLocationRequest.setFastestInterval(5000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
LocationServices.FusedLocationApi.requestLocationUpdates(
            mGoogleApiClient, mLocationRequest, mGeofencePendingIntent);

现在我们可以注册地理围栏了。

以下是我对上述工作的理解: 根据documentation: "如果您的应用程序想要被动地观察其他应用程序触发的位置更新,但又不消耗任何额外的电量,则使用 PASSIVE_PROVIDER 此提供程序不会主动打开或修改主动位置提供程序"

在我看来,添加的地理围栏是 PASSIVE_PROVIDERS 之一。这可以解释为什么在打开 Google 地图时会触发地理围栏。

当然,我们可以使用 PRIORITY_BALANCED_POWER_ACCURACY 而不是 HIGH (~40m accuracy) 来节省一些电量,并且可以明智地了解何时打开地理围栏以及使用多长时间。

【讨论】:

以上是关于地理围栏无法按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

addProximityAlert 无法按预期工作

地理围栏无法正常工作

为啥我的代码在地理围栏中没有 Dispatcher.RunAsync 时无法工作 [重复]

Android 磨损:地理围栏 - ApiException:1000

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

地理围栏在 Android 中完全无法使用吗?