Я использую средство оповещения о дальности в библиотеке altbeacon для определения дальности для маяков в течение 30 секунд.Уведомитель диапазона находится в классе Application и не имеет внедренного уведомителя начальной загрузки или потребителя маяка.Когда программа запускается на переднем плане, выдает код, показанный ниже, она никогда не должна достигать фона.
Почему это происходит, если приложение работает на переднем плане?
О телефоне: Android 9.0 GoogleПиксель 2 Версия библиотеки: Altbeacon 2.15.2
11-28 16:43:44.052 13258-13258/com.testapp.app W/JobInfo: Requested interval +5m0s0ms for job 208352940 is too small; raising to +15m0s0ms
Requested flex 0 for job 208352940 is too small; raising to +5m0s0ms
11-28 16:44:24.276 13258-13258/com.testapp.app W/JobInfo: Requested interval +5m0s0ms for job 208352940 is too small; raising to +15m0s0ms
Requested flex 0 for job 208352940 is too small; raising to +5m0s0ms
11-28 16:44:24.332 13258-13258/com.testapp.app W/JobInfo: Requested interval +5m0s0ms for job 208352940 is too small; raising to +15m0s0ms
11-28 16:44:24.426 13258-13258/com.testapp.app W/JobInfo: Requested interval +5m0s0ms for job 208352940 is too small; raising to +15m0s0ms
Requested flex 0 for job 208352940 is too small; raising to +5m0s0ms
11-28 16:44:25.010 13258-13258/com.testapp.app W/JobInfo: Requested interval +5m0s0ms for job 208352940 is too small; raising to +15m0s0ms
Requested flex 0 for job 208352940 is too small; raising to +5m0s0ms
Ниже приведен код, который, как мне кажется, имеет отношение к библиотеке altbeacon.
Контекст кода: я реализовал уведомитель диапазона и загрузчик уведомленийв классе, который расширяет приложение.Метод StartRanging вызывается при вызове методов-уведомителей Bootstrap или из-за проблем, связанных с действием.Действие вызывается, когда пользователь нажимает на кнопку из другого действия, и в любой момент он может вернуться к старому действию.Как только они переходят между этими двумя действиями, создаются вышеупомянутые журналы.Я выполняю диапазон только в течение 30 секунд, и после того, как эти 30 секунд превышены, вызывается диапазон останова.
Класс, расширяющий область применения:
Создание:
beaconManager = BeaconManager.getInstanceForApplication(this);
//Set the time the app last scanned
scanningTime = 0;
backgroundPowerSaver = new BackgroundPowerSaver(this);
beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24")); //iBeacon
Region beaconRegion1 = new Region("Beacon1", Identifier.parse("HidingUUID1"), null, null);
Region beaconRegion2 = new Region("Beacon2", Identifier.parse("HidingUUID2"), null, null);
Region beaconRegion3 = new Region("Beacon3", Identifier.parse("HidingUUID3"), null, null);
Region beaconRegion4 = new Region("Beacon4", Identifier.parse("HidingUUID4"), null, null);
Region beaconRegion5 = new Region("Beacon5", Identifier.parse("HidingUUID5"), null, null);
rangingRegion = new Region("RangingRegion", null, null, null);
regionBootstrap = new RegionBootstrap(this, beaconRegion1);
regionBootstrap.addRegion(beaconRegion2);
regionBootstrap.addRegion(beaconRegion3);
regionBootstrap.addRegion(beaconRegion4);
regionBootstrap.addRegion(beaconRegion5);
Методы уведомлений начальной загрузки:
@Override
public void didEnterRegion(Region region) {
beaconRegionEvent = true;
StartRanging();
}
@Override
public void didExitRegion(Region region) {
beaconRegionEvent = true;
StartRanging();
}
@Override
public void didDetermineStateForRegion(int i, Region region) {
if (i == 1) {
beaconRegionEvent = true;
StartRanging();
}
}
StartRanging: проверяет, происходит ли ранжирование, а если нет, то начинает ранжирование.
public boolean StartRanging() {
long now = System.currentTimeMillis();
if (now - scanningTime <= Globals.MAX_RANGING_PERIOD * 1000 && scanningTime != 0) {
Timber.e("Minimum time since previous scan has not passed");
return false;
}
try {
beaconManager.startRangingBeaconsInRegion(rangingRegion);
Timber.e("Starting Range");
//Scanning is about to happen so set the scan time
scanningTime = System.currentTimeMillis();
} catch (RemoteException e) {
Timber.e("Unable to initialize ranging");
e.printStackTrace();
return false;
}
//Add this range notifier to the beacon manager
if (beaconManager.getRangingNotifiers().size() < 1) {
beaconManager.addRangeNotifier(this);
}
return true;
}
StopRanging:
public void StopRanging() {
try {
//Remove the regions being ranged
beaconManager.stopRangingBeaconsInRegion(rangingRegion);
} catch (RemoteException e) {
e.printStackTrace();
Timber.e("Cant stop ranging " + e.toString());
}
Timber.d("Stopped Beacon Ranging");
}
Сделал RangeBeaconsInRegion
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
long now = System.currentTimeMillis();
if (now - scanningTime > Globals.MAX_RANGING_PERIOD * 1000 && scanningTime != 0) {
StopRanging();
}
}
Операция, при которой сканирование слишком часто происходит в коде: каждую секунду, когда эта операция открыта, мы вызываем метод StartRanging.
Функция Runnable вызывается в onCreate ()
Runnable ScanTimer = new Runnable() {
@Override
public void run() {
Timber.d("In Runnable");
handler.postDelayed(ScanTimer, 1000);
Timber.d("Checks were good starting ranging");
App.getInstance().StartRanging();
}
};