Android Bluetooth LE SCAN_FAILED_OUT_OF_HARDWARE_RESOURCES - PullRequest
0 голосов
/ 29 июня 2018

В моем приложении Bluetooth LE для Android (API версии 21 и выше) приложение запускается путем сканирования периферийных устройств с использованием объекта BluetoothLeScanner и ScanCallback.

Это отлично работает в первые несколько раз, когда приложение запускается, но после запуска и остановки приложения несколько раз из Android Studio, вызывается обратный вызов onScanFailed() с errorCode из 5. Этот код даже не отображается ScanCallback.java, но источники показывают, что он объявлен как public static final int SCAN_FAILED_OUT_OF_HARDWARE_RESOURCES = 5.

Когда появляется эта ошибка, единственный способ восстановить нормальное поведение приложения - выключить и снова включить Bluetooth.

Этот код ошибки кажется совершенно недокументированным и при этом редким. Еще более интересным становится то, что после обнаружения устройства приложение начинает сканирование с использованием другого обратного вызова, который прослушивает широковещательные сообщения с устройства. Этот сеанс сканирования всегда будет запускаться надежно, даже после того, как начальное сканирование обнаружения получило код ошибки 5.

Настройки для двух разных ScanCallback отличаются по-разному.

Сканер обнаружения настроен следующим образом:

ScanSettings.Builder()
            .setScanMode(ScanSettings.SCAN_MODE_LOW_POWER)
            .also {
                if(Build.VERSION.SDK_INT >= 23) 
                    it.setCallbackType(ScanSettings.CALLBACK_TYPE_FIRST_MATCH)
            }
            .build()

И с фильтром тоже: ScanFilter.Builder().setServiceUuid(BluetoothUUID.service.parcelUuid).build()

Между тем, широковещательный сканер прослушивания настроен следующим образом:

ScanSettings.Builder()
            .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
            .build()

Фильтр для широковещательного сканера пуст.

Как избежать перевода подсистемы BLE в это состояние и почему это вообще происходит?

1 Ответ

0 голосов
/ 08 августа 2018

Решение для избавления от этого - не использовать ScanSettings.CALLBACK_TYPE_FIRST_MATCH. Это Android, с его множеством различных устройств, ваш пробег может варьироваться.

...