У меня проблема с запуском сканирования BLE на Huawei P30 с Android 10. Он работает на Huawei P20 с Android 9 и на многих других устройствах, но Android 10 странно. В приложении у меня есть кнопка «Начать сканирование», так что это сканирование во время работы приложения (без фонового сканирования). Когда я нажимаю эту кнопку, я вижу, что это состояние RxBleClient.State.READY и выполняется код внутри этого блока. К сожалению, код внутри подписки не вызывается. Странно то, что когда мобильный экран заблокирован, а затем разблокирован, начнется сканирование. То же самое происходит, когда BT выключается и снова включается
stateDisposable = rxBleClient.observeStateChanges().startWith(rxBleClient.state)
// switchMap makes sure that if the state will change
// the rxBleClient.scanBleDevices() will dispose and thus end the scan
.switchMap<Any> { state ->
stateSubject.onNext(convertState(state))
when (state) {
RxBleClient.State.READY -> {
return@switchMap rxBleClient.scanBleDevices(
ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_BALANCED)
.build(),
ScanFilter.Builder()
.setServiceUuid(ParcelUuid(UUID.fromString(Constants.UUID_SERVICE_BATTERY)))
.build()
)
}
RxBleClient.State.BLUETOOTH_NOT_AVAILABLE,
// basically no functionality will work here
RxBleClient.State.LOCATION_PERMISSION_NOT_GRANTED,
// scanning and connecting will not work
RxBleClient.State.BLUETOOTH_NOT_ENABLED,
// scanning and connecting will not work
RxBleClient.State.LOCATION_SERVICES_NOT_ENABLED -> {
// scanning will not work
return@switchMap Observable.empty()
}
}
}
.subscribe(
{ rxBleScanResult ->
println("XXX scan received")
if (rxBleScanResult is ScanResult) {
println("XXX scan received address: ${rxBleScanResult.bleDevice.macAddress}")
scanResultSubject.onNext(scanResults)
}
},
{ throwable ->
println("Error when scanning BLE devices: $throwable")
}
)
Кто-нибудь знает, как это исправить?