地理围栏无法按预期工作

Geofences do not work as expected

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

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

情况如下:

Gofence ENTER 触发。

现在,为了确保 KML 确实有效,我打开 Google 地图。我玩 KML,我可以看到蓝色 "You Are Here" 点很好地进出地理围栏,并且地理围栏 do 被触发。

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

所以,在我看来,Goefence 只有在 GPS 明确开启时才会被触发。

有人可以解释一下吗? Stack Overflow 上有很多问题都在处理同样的问题。

谢谢。

编辑: 有没有用真机实地测试phone。 位置更新 应用 运行 并跟踪我 Creating and Monitoring Geofences example app 时收到 ENTER/EXIT 事件。我一终止位置更新应用程序,Geofences 应用程序就停止接收 ENTER/EXIT 事件。

在我看来 Google 已经将 Geofences 的功耗优化到了无用的程度。

我找到了解决办法。这是一种滥用,但这是让 Geofence 有用的唯一方法。

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

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 instead of HIGH (~40m accuracy) 来节省一些电量,并在何时开启地理围栏以及开启多长时间。