使用半径内的设备添加地理围栏时从未收到地理围栏停留事件

Posted

技术标签:

【中文标题】使用半径内的设备添加地理围栏时从未收到地理围栏停留事件【英文标题】:geofencing dwell event never received when adding geofence with device within the radius 【发布时间】:2018-10-22 15:59:33 【问题描述】:

我使用LocationServices.getFusedLocationProviderClientLocationServices.getGeofencingClient 制作了一个简单的测试应用程序,设置位置和地理围栏监控。

我仅使用停留转换通知和初始触发器添加了一个地理围栏,具有正确的位置和半径,这样我在添加地理围栏后很快就会期待“停留”事件:

geofenceBuilder.setTransitionTypes(Geofence.GEOFENCE_TRANSITION_DWELL);
...
builder.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_DWELL);

在设备日志中,我注意到这两个中的几个,每次都获得位置:

从未触发地理围栏待定意图。设备在我的桌子上。

我不明白发生了什么。我什至尝试切换到谷歌地图并切换回应用程序,它没有做任何事情。自从我使用它以来,该设备显然没有处于任何深度睡眠状态。那么什么是深度睡眠呢?我在猜测 Google Play 服务中的一些地理围栏组件?但是应用程序会不断查询该位置,那么为什么 Google Play 服务地理围栏没有看到我在该位置内并发送 'dwell' 事件?

在我用设备在房子周围移动后,两个日志条目不再出现,我得到了地理围栏停留事件!

我的结论是,如果设备\android 组件在设置地理围栏时处于这种“睡眠”模式,我认为地理围栏事件不会触发,至少不是我的“驻留”测试,在我写这篇文章时,我还没有测试是否调用了“输入”。

什么是“深度睡眠模式”和“GeofencerStateMachine”?它来自 Android Google Play 服务吗?它是如何工作的?我没有收到“dwell”事件的原因是什么?

在另一台设备(三星 Galaxy)上,我看到相同的行为,未收到暂停事件,但没有类似的“深度睡眠”日志条目,并且移动设备不会使其收到“暂停” ' 事件...

我正在记录设备坐标,我可以清楚地看到精度在 10 左右,但没有发送暂停事件。

更新:我将设备放在桌子上大约 40 分钟。回来,打开应用程序,启动地理围栏,再次,没有收到任何停留事件,现在甚至没有日志事件说“位置下降,因为处于深度静止模式”......我迷路了......

更新 2:即使在重新安装应用程序后,它也不会接收到驻留或输入事件(我还添加了对“输入”的监控)

【问题讨论】:

你知道什么是“深度静止模式”吗?同样的事情发生在我身上 不。 API 被碰运气,你得到一些可能非常错误的结论 【参考方案1】:

注意:仅当您在注册时尚未进入地理围栏时才会发生停留事件,如果您在注册后走进地理围栏内,它将起作用。

您也可以尝试使用假 gps 进行测试并不断更改位置,一直为我工作。

我尝试了以下解决方案,并且都对我有用。

第一个解决方案与您的情况相同,因为您只想拥有停留事件。


builder.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_DWELL);

builder.setLoiteringDelay(500);
you also have to add this method(time in millis)

第二个解决方案适用于希望所有三个事件“进入”、“停留”和“退出”的人

按照代码sn-p

// Register your initial trigger with both 'ENTER' & 'DWELL' events
.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER | GeofencingRequest.INITIAL_TRIGGER_DWELL);

//and then set transition types for all three events

.setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_DWELL |
 Geofence.GEOFENCE_TRANSITION_EXIT);


//dont forget to add the setLoiteringDelay, in millis

.setLoiteringDelay(5000);

希望你们也能这样。 如果有人需要,我可以提供完整的工作解决方案,请发表评论。

【讨论】:

以上是关于使用半径内的设备添加地理围栏时从未收到地理围栏停留事件的主要内容,如果未能解决你的问题,请参考以下文章

onHandleWork 从未收到来自 pendingintent 地理围栏的意图

地理围栏算法

如何使用 Android 地理围栏 API?

仅在需要时重新注册地理围栏

Android:提高地理围栏的准确性

圆形和矩形地理围栏的C逻辑/算法?