Сканирование на основе намерений с помощью библиотеки Android Beacon Library

Я пытаюсь обнаружить iBeacons с помощью Библиотеки маяков Android, пока мое приложение Android находится в выключенном состоянии (не отображается в диспетчере задач).

Мне уже удалось отслеживать и ранжировать регионы iBeacon с помощью служб переднего плана, и все работает. Теперь я хочу попробовать сканирование на основе намерений для обнаружения маяков, но, видимо, мне чего-то не хватает, чтобы это сработало. Я пытался настроить сканирование на основе намерений с помощью доступного эталонного приложения Kotlin, но мне кажется, что я не до конца понимал, как работает сканирование на основе намерений.

Ниже я сообщаю о полезной части моего кода:

override fun onCreate() {
    super.onCreate()

    val beaconManager = BeaconManager.getInstanceForApplication(this)
    BeaconManager.setDebug(true)

    val parser = BeaconParser().
    setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24")
    parser.setHardwareAssistManufacturerCodes(arrayOf(0x004c).toIntArray())
    beaconManager.getBeaconParsers().add(
        parser)

    setupBeaconScanning()
}

fun setupBeaconScanning() {
    val beaconManager = BeaconManager.getInstanceForApplication(this)

    // Enable intent-based scans
    beaconManager.setIntentScanningStrategyEnabled(true)

    beaconManager.startMonitoring(region)

    val regionViewModel = BeaconManager.getInstanceForApplication(this).getRegionViewModel(region)
    regionViewModel.regionState.observeForever(centralMonitoringObserver)
}

val centralMonitoringObserver = Observer<Int> { state ->
    if (state == MonitorNotifier.OUTSIDE) {
        Log.d(TAG, "outside beacon region: " + region)
    }
    else {
        Log.d(TAG, "inside beacon region: " + region)
        sendNotification()
    }
}

В этой конфигурации мониторинг не работает (ни когда приложение находится на переднем плане, ни когда приложение находится в фоновом режиме).

0
0
251
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам необходимо добавить код для получения обновлений ранжирования, поскольку API мониторинга не очень хорошо работают со стратегией намеренного сканирования. Вероятно, вы получаете событие входа, но никогда не получаете событие выхода (ожидается).

Согласно документам, касающимся стратегии Intent Scan:

Он не будет уведомлять вас об исчезновении маяков — ваше приложение никогда не получит событие региона выхода, когда исчезнут все маяки, а при использовании API ранжирования (рекомендуется для стратегии Intent Scan) вы просто перестанете получать обновления диапазона, как только исчезнет последний маяк. .

https://altbeacon.github.io/android-beacon-library/detection_times.html

Спасибо Дэвиду за быстрый ответ. Я изменил код, как вы предложили, и добавил обновления диапазона. Я также добавил эту строку кода перед настройкой стратегии сканирования на основе намерений: beaconManager.setEnableScheduledScanJobs(true). Теперь приложение правильно определяет местоположение маяков, пока оно находится на переднем плане, но когда я закрываю приложение, я не получаю никаких обновлений. Есть ли у вас какие-либо идеи, почему это происходит?

guti 09.04.2024 19:52

Попробуйте установить beaconManager.backgroundScanPeriod = 1100 и beaconManager.backgeoundBetweenScanPeriod = 0. Если вы этого не сделаете, будут применяться периоды фонового сканирования по умолчанию, и вы будете получать обновление диапазона только каждые 5 минут.

davidgyoung 09.04.2024 21:30

Только что попробовал, но пока приложение закрыто, результатов нет. Возможно, стоит открыть вопрос на GitHub, чтобы лучше изучить проблему?

guti 09.04.2024 22:01

Видите ли вы фоновые обновления, если запустите приложение и просто выключите экран? Имеет ли приложение разрешение на определение местоположения в фоновом режиме, предоставленное пользователем? (Проверьте «Настройки» -> «Приложения» -> «Ваше приложение» -> «Разрешения»). Когда вы «убиваете» приложение, как вы это делаете?

davidgyoung 10.04.2024 04:22

Если я запущу приложение и выключу экран, то обновления смогу увидеть, но примерно через 30 секунд я их уже не увижу. Когда я закрываю приложение (свайпом вверх из диспетчера задач), я не вижу никаких уведомлений. Я проверил разрешения приложения и у меня есть: местоположение («Разрешить все время»), устройства поблизости и уведомления.

guti 10.04.2024 16:18

Какая у вас модель телефона и версия ОС? Можете ли вы получить снимок LogCat (с журналами системного уровня, а также вашего приложения) за 15 секунд до и после остановки обновлений? На Vanilla Android (Pixel, Motorola) и многих OEM-версиях эти обновления продолжаются бесконечно. Но некоторые OEM-производители настраивают это поведение.

davidgyoung 11.04.2024 15:55

Я использую Samsung A52, Android 14. В LogCat я нашел следующие журналы, которые могут быть полезны: org.altbeacon.beaconreference(state: Freezeable -> Frozen, Reason: uidIdle) и [GSIM LOG]: gsimLogHandler, msg: MESSAGE_SCAN_STOP, appName: org.altbeacon.beaconreference, scannerId: 10, reportDelayMillis=0. Эти две строки журнала возникают, как только убитое приложение перестает обнаруживать маяки.

guti 11.04.2024 18:23

Мне не удалось воспроизвести описанную выше проблему со строкой журнала на двух других устройствах Samsung с Android 14, но мне удалось воспроизвести нечто подобное. Я добавил второй ответ с подробностями.

davidgyoung 15.04.2024 01:07

Мне удалось воспроизвести сообщение org.altbeacon.beaconreference(state: Freezeable -> Frozen, Reason: uidIdle) and [GSIM LOG]: gsimLogHandler, msg: MESSAGE_SCAN_STOP на Android 14 только после закрытия приложения. Я добавил второй ответ с подробностями.

davidgyoung 15.04.2024 01:20
Ответ принят как подходящий

Начиная с Android 14, устройства Samsung прекратят целенаправленное сканирование Bluetooth, если пользователь закроет приложение, смахнув его с экрана.

2024-04-14 20:05:58.646 4387-4990 BtGatt.GattService pid-4387 E [GSIM LOG]: gsimLogHandler, msg: MESSAGE_SCAN_STOP, appName: org.altbeacon.beaconreference, scannerId: 8, reportDelayMillis=0

Сканирование возобновится автоматически после запуска библиотеки ScanJob, которое должно происходить каждые 15 минут +/- 5 минут. После приведенной выше последовательности вы можете видеть, что это происходит примерно через шесть минут:

2024-04-14 20:11:07.541 28466-28466 BeaconManager           org.altbeacon.beaconreference        I  BeaconManager started up on pid 28466 named 'org.altbeacon.beaconreference' for application package 'org.altbeacon.beaconreference'.  isMainProcess=true
2024-04-14 20:11:07.607 28466-28466 ScanJob                 org.altbeacon.beaconreference        I  Using immediateScanJobId from manifest: 208352939
2024-04-14 20:11:08.178 28466-28496 ScanHelper              org.altbeacon.beaconreference        D  beacon detected : id1: 74278bda-b644-4520-8f0c-720eaf059935 id2: 256 id3: 15187

На самом деле это новый запуск приложения, запущенный в фоновом режиме при запуске 15-минутного задания.

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

По соответствующему вопросу:

Начиная с Android 14, устройства Samsung не будут предоставлять результаты сканирования Beacon через BroadcastIntent, если экран будет выключен после первого запуска приложения. Доставка возобновится, как только экран снова загорится.

Для приложений, использующих библиотеку Android Beacon и IntentScanStrategy, это означает, что устройства Samsung с Android 14 не будут обнаруживать (на короткое время) период между первым выключенным экраном и следующим включенным экраном после запуска приложения. Неясно, является ли это ошибкой Samsung или каким-то преднамеренным поведением.

См. соответствующую проблему в репозитории с открытым исходным кодом библиотеки Android Beacon Library здесь для получения дополнительной информации.

Спасибо за ответ, Дэвид. Чтобы достичь своей цели, мне нужно сканировать каждые ~ 10 секунд, пока приложение закрыто. Учитывая тот факт, что сканирование на основе намерений — не лучший вариант для моего случая, являются ли службы переднего плана единственной возможностью или я могу попробовать что-то еще?

guti 15.04.2024 10:04

Службы переднего плана являются основной альтернативой, но у них есть свои проблемы — особенно серьезные ограничения на их запуск в фоновом режиме без жестов пользователя. Я подозреваю, что в конечном итоге они будут давать вам более частые отключения, чем просто согласие на 15-минутное отключение после закрытия приложения. Вы также можете поэкспериментировать с использованием настроек Samsung, чтобы снять фоновые ограничения для приложения, чтобы посмотреть, изменит ли это такое поведение.

davidgyoung 16.04.2024 00:53

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