Java 如何实施";“不驻留”;安卓地理围栏?

Java 如何实施";“不驻留”;安卓地理围栏?,java,android,android-geofence,Java,Android,Android Geofence,我在理解机器人的地理围栏方面有问题 实际问题:我使用了谷歌geofence api中的Enter+Exit事件,但在许多设备上,该信号非常不准确,以至于它会跳入或跳出围栏(跳转通常大于半径400m) 计划解决方案:所以我想使用Dwell来“平滑”这一点。如果该位置在围栏内停留一分钟,则会发生停顿。到现在为止,一直都还不错。但是我怎样才能发现篱笆的叶子呢?当我使用Exit时,由于这些信号跳转,可能会发生几次Exit。当我离开土工栅栏一分钟多的时候,我需要的是一种“undwell” 我希望避免使用自

我在理解机器人的地理围栏方面有问题

实际问题:我使用了谷歌geofence api中的
Enter
+
Exit
事件,但在许多设备上,该信号非常不准确,以至于它会跳入或跳出围栏(跳转通常大于半径400m)

计划解决方案:所以我想使用
Dwell
来“平滑”这一点。如果该位置在围栏内停留一分钟,则会发生停顿。到现在为止,一直都还不错。但是我怎样才能发现篱笆的叶子呢?当我使用
Exit
时,由于这些信号跳转,可能会发生几次
Exit
。当我离开土工栅栏一分钟多的时候,我需要的是一种“undwell”

我希望避免使用自定义逻辑重新实现整个Geofence,这些逻辑在快速重复的地理位置上注册,并过滤掉小的异常值


问:geofence api中是否有实现“undwell”的功能?或者,是否有最佳做法来检查
退出是否是真正的退出

在Google Geofences中,Enter事件在您每次进入Geofences时触发,Exit事件在您每次越过Geofences边界时触发。当您在地理围栏内停留指定时间间隔时,也会触发驻留事件

    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;
    }
在你的例子中,如果你在不到一分钟的时间里不断地跳进跳出一个土工栅栏,居住就永远不会发生

如果您进入地理围栏,enter事件触发,然后您在里面停留一分钟或更长时间,停留将发生,停留发生后,如果您注意到任何退出事件,您可以将该退出事件用作真正的退出

注意:您还可以增加Geofence的半径


我希望我的回答能让你明白。:)

这只是一个想法,但对于每个区域,您都可以注册两个半径不同的地理围栏。注册以侦听半径较小的地理围栏的驻留,以及另一个的退出。

您可以使用
setNotificationResponsibility
设置更长的通知时间,因此您不会收到退出事件,除非它在该时间段内确实处于围栏之外,因此,如果在这段时间内发生跳转,跳转不会触发退出事件,这是行不通的,因为你会立即退出,而不是停留。因此,如果你使用暂停+退出,你会得到如下结果:(忽略输入)->暂停->退出->(忽略输入)->退出->(忽略输入)->退出->(忽略输入)->暂停->退出在我的情况下,我从来没有注意到任何跳进跳出围栏的情况。尝试检查您的LocationServices API。你是怎么知道位置的?尝试获得更准确的位置。它可能会解决这个问题。我已经创建了一个测试版本,如果我添加了
requestLocationUpdates
,具有高精度,间隔30秒,除了Geofenses之外。它确实提高了准确性,但也带来了更多的“跳跃”。我收到了几个用户的地理日志,他们没有移动手机,我在地图上添加了这些30秒的值。您可以在围栏内看到30个值,然后在500米外看到1个值,然后在围栏内看到接下来的30个值。所有供应商都是如此。因此,到目前为止,我找到的唯一解决办法是每隔几秒钟请求一个pos并平滑信号。这个答案更像是“驻留”的替代实现,而不是我想要的“undwell”。此外,1秒的时间似乎比其他解决方法更糟糕(比如启动一次触发计时器来重新检查用户是否真的离开了围栏)(嘿,Jens,这对你来说是怎么回事?因为我的问题有很多人投票,但答案/建议几乎没有人投票,我认为不存在现成的东西或最佳实践。我目前正在做的是尝试两种方法:一种是实施“undwell”,这意味着:在退出时,我开始定期更新位置并接收3个位置更新。如果所有3个位置都在外部,我将其视为真正的出口,然后移除侦听器。第二个实验是使用LocationUpdate对所有人进行隔离,并对自己进行平滑处理(使用3个,甚至5个位置,忽略异常值)。我只是想知道你是否曾经设法找到解决这个问题的方法,因为我目前也被这个问题困扰着,非常感谢你的帮助。是的,我坚持我最后一次评论的建议,而不是你的。我在退出活动后通过简单的位置更新自己做了这件事,并决定我是否真的足够长的时间外出,但你也需要注意所有其他影响,如用户可能再次快速进入围栏等。退出事件仍然是问题所在,因为它会立即触发。因此,这并不能解决“跳跃位置”问题问题。但基于这一想法,可以工作的是一个外部大地理围栏,也可以监听驻留。如果外部驻留是在内部处于退出状态时启动的,这意味着,你在外部。但仍然有两个问题。一个是,时间可能不好,当驻留时,你只是跳进了较小的围栏内另一个是,你不知道更新率,所以外部围栏应该和城市或国家一样大。