Android Altbeacon вызывает сканирование запланированных задач - PullRequest
0 голосов
/ 29 ноября 2018

Я использую средство оповещения о дальности в библиотеке 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();

    }
};

1 Ответ

0 голосов
/ 05 декабря 2018

Следует понимать, что как для API-интерфейсов мониторинга маяков (которые запускаются с RegionBootstrap), так и для API-интерфейсов ранжирования (запущенных с startRangingBeaconsInRegion) требуется сканирование маяков, которое реализуется в библиотеке запланированными заданиями для выполнения сканирования.

Таким образом, даже если код останавливается в диапазоне по таймеру, он не останавливает мониторинг, который продолжается бесконечно.Вот почему в журналах показывается, что для сканирования планируется продолжить работу.Если вы хотите остановить все сканирование, вы должны отключить мониторинг с помощью regionBootstrap.disable();

...