В нашем проекте нам нужно очень быстрое (в идеале менее нескольких секунд) надежное и непрерывное обнаружение маяка, что особенно важно в фоновом режиме.Прямо сейчас мы используем библиотеку AltBeacon, BeaconManager запускается с контекстом службы переднего плана (код предоставлен).
На переднем плане она отлично работает практически на любом устройстве, проблема в работе в фоновом режиме.Некоторые устройства в фоновом режиме не работают через некоторое время (например, Huawei P9 2017, я знаю, что это проблема с устройством).В общем, нам нужна лучшая надежность.
Самая большая проблема заключается в том, что обнаружение на Oreo в фоновом режиме происходит медленно - от секунд до долгих минут, пока он не сообщит о первом маяке.Я прочитал запись на веб-сайте AltBeacon об изменениях для Oreo, поэтому я знаю, что в системе есть ограничения.Итак, вот мой вопрос, есть ли способ улучшить отзывчивость обнаружения (в идеале на всех версиях Android)?Даже по цене большего расхода батареи или некоторых хаков?Я попытался по крайней мере получить исключение из оптимизации батареи в системе, но результаты, вероятно, такие же.
Конфигурация BeaconManager в Фоновом сервисе:
@Override
public void onCreate() {
super.onCreate();
beaconManager = BeaconManager.getInstanceForApplication(this);
beaconManager.setForegroundScanPeriod(1500);
beaconManager.setForegroundBetweenScanPeriod(0);
beaconManager.setBackgroundScanPeriod(1500);
beaconManager.setBackgroundBetweenScanPeriod(0);
beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout(BeaconParser.EDDYSTONE_UID_LAYOUT));
beaconManager.bind(this);
if (CommConstants.sdkIsAtLeastSDK(21)) {
BluetoothMedic medic = BluetoothMedic.getInstance();
medic.enablePowerCycleOnFailures(this);
medic.enablePeriodicTests(this, BluetoothMedic.SCAN_TEST);
}
goForeground();
}
Запуск мониторинга:
private static final Region REGION = new Region(BuildConfig.APPLICATION_ID, null, null, null);
protected void startBeaconMonitoring() {
if (beaconManager.isBound(this)) {
findingEnabled = true;
beaconManager.addRangeNotifier(
(collection, region) -> {
for (Beacon beacon : collection) {
// beacon processing
}
});
try {
mLogger.debug("Started beacon monitoring");
beaconManager.startRangingBeaconsInRegion(REGION);
beaconManager.startMonitoringBeaconsInRegion(REGION);
} catch (RemoteException e) {
LoggerFactory.getLogger(App.class).error("Monitoring start exception", e);
}
regionBootstrap = new RegionBootstrap(this, REGION);
startLocationUpdates();
}
}
Я заметил, что PR-служба маяка находится на переднем плане в библиотеке-маяка-андроида, возможно ли, что это повысит надежность?