如何在 android 地理围栏中实现“取消驻留”?
Posted
技术标签:
【中文标题】如何在 android 地理围栏中实现“取消驻留”?【英文标题】:How to implement "un-dwell" in android geofences? 【发布时间】:2016-05-03 01:36:28 【问题描述】:我无法理解 android 的地理围栏。
实际问题:我使用了来自 google 的 geofence-api 的 Enter
+Exit
事件,但在许多设备上,信号非常不准确,以至于它跳进跳出围栏(跳跃更大通常比半径 400m)。
计划中的解决方案:所以我想使用Dwell
来“平滑”这个。如果该位置在栅栏内停留一分钟,就会发生停留。到目前为止,一切都很好。但是我如何检测栅栏的离开呢?当我使用Exit
时,由于这些信号跳跃,可能会发生几个Exit
。当我离开地理围栏超过一分钟时,我需要的是一种“放松”。
我想避免使用在快速重复的地理位置上注册并过滤掉小的异常值的自定义逻辑重新实现整个地理围栏。
问题:geofence-api 中有什么东西可以实现“放松”吗?或者是否有最佳实践来检查Exit
是否是真正的退出?
【问题讨论】:
嘿,这对你来说是怎么回事@Jens? 因为对我的问题有很多投票,但对答案/建议几乎没有投票,我认为不存在开箱即用的东西或最佳实践。我目前正在做的是使用 2 种方法:一种是实现 'undwell',这意味着:在退出时我开始定期位置更新并收到 3 个位置更新。如果所有 3 个仍然在外面,我接受它作为一个真正的出口,然后,删除监听器。第二个实验是我自己用 locationUpdates 围起来,自己也做平滑(使用 3 个,甚至 5 个位置,忽略异常值)。 只是想知道您是否曾经设法找到解决此问题的方法,因为我目前也遇到此问题,非常感谢您的帮助。 是的,我坚持我对你的最后评论的建议。我自己在 EXIT 事件后进行了简单的位置更新,并自行决定我是否真的在外面足够长,但您还需要了解所有其他影响,例如用户可能再次快速进入围栏等。跨度> 【参考方案1】: public long lastEnterTime = 0;
public void initTimer()
Timer timer = new Timer();
timer.schedule(new TimerTask()
@Override
public void run()
if(lastEnterTime!=0 && System.currentTimeMillis() > lastEnterTime + 1000*60)
lastEnterTime = System.currentTimeMillis();
onRealEnter();
,0,1000);
public void onRealEnter()
public void onEnter()
lastEnterTime = System.currentTimeMillis();
public void onExit()
lastEnterTime = 0;
【讨论】:
这个答案更像是“dwell”的替代实现,而不是我想要的“undwell”。此外,1 秒时间似乎比其他解决方法更糟糕(比如只是启动 1 次触发计时器来重新检查用户是否真的离开了围栏)。 :(【参考方案2】:在 Google 地理围栏中,Enter 事件会在您每次进入地理围栏时触发,Exit 事件会在您每次越过地理围栏边界时触发。当您在地理围栏内停留指定的时间间隔时,还会触发 Dwell 事件。
在您的情况下,如果您在不到一分钟的时间内不断进出地理围栏,则永远不会发生 Dwell。
如果你进入地理围栏,Enter事件触发,然后你在里面停留一分钟或更长时间,Dwell会发生,在Dwell发生后,如果你注意任何 Exit 事件,您可以将该 Exit 事件用作真正的 Exit。
注意:您也可以增加地理围栏的半径。
我希望我的回答对你来说是清楚的。 :)
【讨论】:
这行不通,因为您在退出时立即获得退出,而不是停留。所以如果你使用dwell+exit,你会想出类似的东西:(ignored enter)->dwell->exit->(ignored enter)->exit->(ignored enter)->exit->(ignored enter)->停留->退出 就我而言,我从来没有注意到任何进出围栏的人。尝试检查您的 LocationServices API。你如何获得位置?尝试获得更准确的位置。它可能会解决问题。 我已经创建了一个测试版本,我是否添加了requestLocationUpdates
以高精度和间隔 30 秒,除了地理围栏。它确实提高了准确性,但也带来了更多的“跳跃”。我收到了几个用户没有移动手机的地理记录,我已经在地图上添加了这些 30s 的值。您可以在栅栏内看到 30 个值,然后在 500 米外看到 1 个值,然后再在里面看到接下来的 30 个值。这发生在所有供应商身上。所以到目前为止我发现的唯一解决方法是每隔几秒请求一次 pos 并平滑信号。这会杀死电池。【参考方案3】:
这只是一个想法,但对于每个区域,您都可以注册两个具有不同半径的地理围栏。注册以侦听 DWELL 以侦听半径较小的地理围栏,并为另一个侦听 EXIT。
【讨论】:
EXIT-Event 仍然是问题,因为它会立即触发。所以这不会解决“跳跃位置”问题。但是基于这个想法可以工作的是一个外部的大地理围栏,也听 DWELL。如果在内部处于退出状态时触发外部 DWELL,则这隐含地意味着您在外部。不过还是有2个问题。一个是,时机可能很糟糕,当你住在外栅栏时,你只是跳进了较小的栅栏。另一个是,你不知道更新率,所以外栅栏应该和城市或国家一样大。【参考方案4】:您可以使用setNotificationResponsiveness
设置更长的通知时间,这样您就不会收到退出事件,除非它在这段时间内确实处于围栏之外,因此如果发生跳转不会触发退出事件这段时间内
【讨论】:
以上是关于如何在 android 地理围栏中实现“取消驻留”?的主要内容,如果未能解决你的问题,请参考以下文章