Библиотека AltBeacon показывает маяки только один раз, а затем перестает их показывать

У меня возникла проблема, и я могу воспроизвести ее на разных устройствах с разными ОС Android. Я получаю ожидаемое поведение при сканировании iBeacon в первый раз. Когда я сканирую в следующий раз, у меня нет маяков. Список результатов в делегате пуст. Я напечатал счет на setRangeNotifier с размером маяков, но, видимо, после того, как он показывает только размер маяков, равный 1, после чего он непрерывно отображает 0.

beaconManager.setRangeNotifier(new RangeNotifier() {
    @Override
    public void didRangeBeaconsInRegion(final Collection<Beacon> beacons, Region region) {
       Log.d("Beacons count",beacons.size());
    }
});

Выход: Количество маяков 1 Количество маяков 0 Количество маяков 0 Количество маяков 0

Мой диапазон измерения и период сканирования, как показано ниже

beaconManager.setBackgroundScanPeriod(1000l);
beaconManager.setBackgroundBetweenScanPeriod(31000l);

3 ответа

Это не ожидаемое поведение, и я не видел этого на Android 4.4 на других устройствах. Исходя из ограниченной информации, возможно, это может быть проблема приложения или проблема с ПЗУ 4.4 CynogenMod для One Plus. Смотрите мой другой ответ с подробным тестовым примером для эталонного устройства (Nexus 5).

Чтобы исключить возможность возникновения проблемы с приложением, попробуйте использовать приложение Locate, основанное на той же библиотеке, и посмотрите, получите ли вы те же результаты.

Я пытался воспроизвести описанные вами симптомы, но не смог сделать это на Nexus 5 с Android 5 и передающим RadBeacon USB.

Эталонные модификации приложения:

  • Добавлены эти строки в метод BeaconReferenceApplication onCreate():

    beaconManager.setBackgroundBetweenScanPeriod(1000l);
    beaconManager.setBackgroundBetweenScanPeriod(31000l);
    beaconManager.setAndroidLScanningDisabled(true);
    BeaconManager.setDebug(true);
    

Третья строка выше необходима, потому что я тестировал Nexus 5 с Android 5 и хотел использовать API сканирования 4.x, как вы делали это на телефоне 4.4.

  • Добавил эту строку к обратному вызову didRangeBeaconsInRegion RangingActivity:

    Log.d(TAG, "ranged beacon: "+firstBeacon.toString());
    

Этапы тестирования:

  • Включить передачу RadBeacon USB с частотой 10 Гц.

  • Зарегистрируйте результаты с помощью:

    $ /Users/dyoung/sdk-android-studio/platform-tools/adb logcat -v time | grep "anged beacon"
    
  • Запустите эталонное приложение, начните масштабирование на переднем плане и через три секунды поместите его в фоновый режим. Смотрите следующие результаты регистрации:

    03-01 08:39:00.146 D/RangingActivity(11146): ranged beacon: id1: 04ff791e-f83b-434b-8031-1b3e72bdbcb7 id2: 1 id3: 1
    03-01 08:39:01.282 D/RangingActivity(11146): ranged beacon: id1: 04ff791e-f83b-434b-8031-1b3e72bdbcb7 id2: 1 id3: 1
    03-01 08:39:02.482 D/RangingActivity(11146): ranged beacon: id1: 04ff791e-f83b-434b-8031-1b3e72bdbcb7 id2: 1 id3: 1
    03-01 08:39:03.515 D/RangingActivity(11146): ranged beacon: id1: 04ff791e-f83b-434b-8031-1b3e72bdbcb7 id2: 1 id3: 1
    03-01 08:39:12.148 D/RangingActivity(11146): ranged beacon: id1: 04ff791e-f83b-434b-8031-1b3e72bdbcb7 id2: 1 id3: 1
    03-01 08:39:44.274 D/RangingActivity(11146): ranged beacon: id1: 04ff791e-f83b-434b-8031-1b3e72bdbcb7 id2: 1 id3: 1
    03-01 08:40:16.179 D/RangingActivity(11146): ranged beacon: id1: 04ff791e-f83b-434b-8031-1b3e72bdbcb7 id2: 1 id3: 1
    03-01 08:40:48.239 D/RangingActivity(11146): ranged beacon: id1: 04ff791e-f83b-434b-8031-1b3e72bdbcb7 id2: 1 id3: 1
    03-01 08:41:20.272 D/RangingActivity(11146): ranged beacon: id1: 04ff791e-f83b-434b-8031-1b3e72bdbcb7 id2: 1 id3: 1
    03-01 08:41:52.205 D/RangingActivity(11146): ranged beacon: id1: 04ff791e-f83b-434b-8031-1b3e72bdbcb7 id2: 1 id3: 1
    03-01 08:42:24.202 D/RangingActivity(11146): ranged beacon: id1: 04ff791e-f83b-434b-8031-1b3e72bdbcb7 id2: 1 id3: 1
    

Как видите, обратные вызовы приходят каждые 1,1 секунды на переднем плане и каждые 32 секунды на заднем плане. Это как и ожидалось.

Если вы не можете повторить вышеуказанные шаги, используя эталонное приложение на устройстве OnePlus с Cyanogenmod 4.4, возможно, проблема связана с ПЗУ для этого устройства. Если вы можете подтвердить это и получить полный вывод Logcat за период, когда обратные вызовы не приходят (с включенной отладкой, как описано выше), тогда, пожалуйста, откройте проблему по адресу http://github.com/AltBeacon/android-beacon-library/issues и прикрепляет копию записи журнала.

После дальнейших размышлений я думаю, что именно интервалы сканирования были проблемой. Указанные интервалы сканирования должны были составлять 1 секунду на поиск маяков каждые 32 секунды. Этого недостаточно для рабочего цикла, особенно для маяков, которые передают только 1 Гц. Не все передачи принимаются из-за радиошума, и важно, чтобы длительности сканирования составляли 1100 мс или более, чтобы предотвратить смещение границы передачи, когда сканер запускается или выключается.

Другие вопросы по тегам