Ibeacon android 关于AltBeacon库,DidRangeBeanConsinRegion()不受Android O后台限制的影响?

Ibeacon android 关于AltBeacon库,DidRangeBeanConsinRegion()不受Android O后台限制的影响?,ibeacon-android,Ibeacon Android,我是安道尔图书馆的用户。这里的文档说,当应用程序是后台时,库检测信标的频率不能超过15分钟。但根据我的测试,当我将后台扫描周期设置为5秒时,即使我的应用程序处于后台,也会每隔10秒使用信标集合调用didRangeBeaconsisnRegion()。我尝试了2.10和2.14,似乎我应用程序中的库不受背景限制的影响(它可以检测任何频率)。那么这里发生了什么?我的理解有问题吗 以下是我要设置的代码: beaconManager = BeaconManager.getInstanceForAppli

我是安道尔图书馆的用户。这里的文档说,当应用程序是后台时,库检测信标的频率不能超过15分钟。但根据我的测试,当我将后台扫描周期设置为5秒时,即使我的应用程序处于后台,也会每隔10秒使用信标集合调用didRangeBeaconsisnRegion()。我尝试了2.10和2.14,似乎我应用程序中的库不受背景限制的影响(它可以检测任何频率)。那么这里发生了什么?我的理解有问题吗

以下是我要设置的代码:

beaconManager = BeaconManager.getInstanceForApplication(context);
    beaconManager.getBeaconParsers().add(new BeaconParser()
            .setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25"));
    beaconManager.setBackgroundBetweenScanPeriod(10000L);
    beaconManager.setForegroundBetweenScanPeriod(2000L);
    beaconManager.bind(this);

@Override
public void onBeaconServiceConnect() {
    Log.i(TAG, "onBeaconServiceConnect.in");
    notifier = new RangeNotifierImpl();
    beaconManager.addRangeNotifier(notifier);
    try {
        final Region region = new Region("myRegion", Identifier.parse(FIRST_ID), null, null);
        beaconManager.startRangingBeaconsInRegion(region);
    } catch (RemoteException e) {
        Log.e(TAG, "startRangingBeaconsInRegion.RemoteException");
    }
}
在活动的onStop/onResume方法中,我将调用

beaconManager.setBackgroundMode(b);

设置背景模式。

您看到的是库的非预期行为,这是由于在没有任何监控的背景下进行测距而导致的

在后台,该库使用intent提供的后台扫描过滤器快速唤醒应用程序,并在常规后台扫描周期之间提供新信标检测结果。但它只有在确定最近没有检测到信标时才会这样做,因为否则唤醒几乎会立即发生,导致电池耗尽

显示的代码通过仅使用测距API而不是监视API来绕过此检查,以查看信标是否可见。库确定是否有任何信标可见是基于它是否在“内部”和受监视的信标区域,因此如果不监视任何信标,则没有

库当然支持无监控的测距,因此不应该发生这种情况。这是库中的一个bug——它不是预期的行为。其结果是,如果信标持续可见,则BackgroundBetweenScan周期将始终缩短,从而导致比配置的设置可能导致的电池消耗多得多——这类似于持续扫描

撇开Bug不谈,这似乎暴露了Android O扫描限制的“漏洞”。接收意向交付扫描将允许更新后台运行时间

如果您希望意外行为消失,并像文档一样工作,只需为您正在测量的同一区域添加“开始监视”


该库的未来版本可能会修复此错误,但如果您真的打算,可以保留使用此漏洞的某种方式。

您看到的是库的意外行为,这是由于在没有任何监控的情况下在后台进行测距而导致的

在后台,该库使用intent提供的后台扫描过滤器快速唤醒应用程序,并在常规后台扫描周期之间提供新信标检测结果。但它只有在确定最近没有检测到信标时才会这样做,因为否则唤醒几乎会立即发生,导致电池耗尽

显示的代码通过仅使用测距API而不是监视API来绕过此检查,以查看信标是否可见。库确定是否有任何信标可见是基于它是否在“内部”和受监视的信标区域,因此如果不监视任何信标,则没有

库当然支持无监控的测距,因此不应该发生这种情况。这是库中的一个bug——它不是预期的行为。其结果是,如果信标持续可见,则BackgroundBetweenScan周期将始终缩短,从而导致比配置的设置可能导致的电池消耗多得多——这类似于持续扫描

撇开Bug不谈,这似乎暴露了Android O扫描限制的“漏洞”。接收意向交付扫描将允许更新后台运行时间

如果您希望意外行为消失,并像文档一样工作,只需为您正在测量的同一区域添加“开始监视”


该库的未来版本可能会修复此错误,但如果您真的打算,可以保留一些使用此漏洞的方法。

我必须查看您的安装代码才能确定,但如果你不使用BackgroundPowerSaver,你就不会自动切换到后台模式,你只需继续以前台的速度运行sac,直到Android在大约10分钟后关闭你的应用程序。谢谢回复。我不使用BackgroundPowerSaver并在活动的onStop/onResume方法中手动设置后台模式。我已经发布了我的升级代码。你肯定你的测试设备有安卓8吗?制造商和型号是什么?总是有可能一些制造商定制了限制,但我认为更可能的解释是,不知何故,背景模式没有正确输入。如果你能设置beaconManager.setDebug(true)并附加一个60秒的LogCat摘录(不在你的应用程序上过滤,这样它会显示系统消息),这可能会让你有所了解。大卫,我很确定我的设备是安卓8.1。这是谷歌像素2。我可以看到扫描时间被切换到15秒,而前景是3秒。我会附上日志。@DavidYoung,在查看altbeacon的源代码后,我发现Android O的背景扫描频率实际上不是5分钟。它由扫描状态的getScanJobRuntimeMillis()决定。在ScanJob、onStartJob()中,scheduleNextScan()被发布以执行。在scheduleNextScan()中,扫描作业将被安排并立即再次执行。这是某种递归。实际扫描间隔时间由getScanJobRuntimeMillis()决定。当应用程序处于后台时,getScanJobRuntimeMillis()返回getBackgroundScanPeriod(),而不是5分钟。我必须查看您的设置代码才能确定,但如果你不使用BackgroundPowerSaver,你就不会自动切换到后台模式,你只需继续以前台的速度运行sac,直到Android在大约10分钟后关闭你的应用程序。谢谢你的回复