我是Andorid AltBeacon图书馆的用户。这里的文档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);
设置后台模式。
答案 0 :(得分:1)
您所看到的是库的意外行为,该行为是由于在后台进行范围调整而不进行监视所致。
在后台,该库使用由意图提供的后台扫描过滤器来快速唤醒应用程序,并在常规后台扫描周期之间通过新的信标检测提供结果。但是,只有在确定最近没有检测到信标的情况下,它才会这样做,因为否则唤醒几乎会立即发生,从而导致电池电量耗尽。
所示的代码规避了此检查,以仅通过使用测距API(而不是监视API)来查看信标是否可见。图书馆确定信标是否可见是基于它是否在信标区域内以及受监视信标区域,因此,如果您不监视任何信标区域,则不会存在。
库当然支持不受监视的范围调整,因此不应发生这种情况。这是库中的错误-这不是预期的行为。结果是,如果持续可见信标,backgroundBetweeenScan周期将始终缩短,这比配置的设置会导致更多的电池耗电,这类似于持续扫描。
撇开漏洞,这似乎揭示了Android O扫描限制中的“漏洞”。接收意图传送的扫描将允许更新后台运行时间。如果您希望意外行为消失并像文档一样工作,只需为您正在测量的同一区域添加开始监视即可。
该库的未来版本可能会修复此错误,但如果您确实打算的话,可以保留使用此漏洞的某种方式。