В моем приложении 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 в это состояние и почему это вообще происходит?