首页 > 解决方案 > 关于 AltBeacon 库,didRangeBeaconsInRegion() 是否不受 Android O 后台限制的影响?

问题描述

我是 Andorid AltBeacon Library 的用户。此处的文档http://www.davidgyoungtech.com/2017/08/07/beacon-detection-with-android-8说,当应用程序为后台时,库无法检测信标的频率超过 15 分钟。但是根据我的测试,当我将后台扫描周期设置为 5 秒时,即使我的应用程序在后台,也会每 10 秒调用一次 didRangeBeaconsInRegion() 并收集信标。而且我尝试了 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");
    }
}

在 Activity 的 onStop/onResume 方法中,我会调用

beaconManager.setBackgroundMode(b);

设置后台模式。

标签: ibeacon-android

解决方案


您所看到的是由于在后台测距而根本没有监控而导致的库的意外行为。

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

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

图书馆当然支持没有监控的测距,所以这不应该发生。这是库中的一个错误——它不是预期的行为。结果是,如果信标持续可见,则 backgroundBetweenScan 周期将始终缩短,从而导致比配置的设置消耗更多的电池,否则会导致 - 它类似于持续扫描。

撇开错误不谈,这似乎揭示了 Android O 扫描限制中的“漏洞”。接收意图传递的扫描将允许更新的后台运行时间。

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

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


推荐阅读