地理围栏无法按预期工作
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) 来节省一些电量,并且可以明智地了解何时打开地理围栏以及使用多长时间。
【讨论】:
以上是关于地理围栏无法按预期工作的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的代码在地理围栏中没有 Dispatcher.RunAsync 时无法工作 [重复]