You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android使用RxAndroidBle扫描BLE设备触发onScanFailure问题求助

RxAndroidBle扫描触发onScanFailure的问题分析与修复

问题描述

使用RxAndroidBle 1.17.0版本在搭载最新Android系统的Pixel 6设备上扫描BLE设备时,运行代码后很快触发onScanFailure事件,日志输出onScanFailure null,目前仅能通过延迟一段时间后重启扫描临时解决,需排查库使用是否存在错误。

代码问题排查

1. 错误日志输出导致无法定位真实原因

代码中throwable.Cause是错误写法(Kotlin属性名需小写),且仅打印cause无法覆盖所有异常信息,这直接导致你看到日志输出null,无法获取扫描失败的具体触发原因。

2. Disposable管理逻辑混乱

  • doFinally { dispose() }中的dispose()方法为空实现,且在onScanFailure中又重复调用scanDisposable?.dispose(),易导致资源重复释放或状态不一致。
  • 扫描失败触发onError时,RxJava的Observable会自动解除订阅,额外的doFinally处理属于冗余操作,反而可能干扰资源释放流程。

3. 扫描重启逻辑存在隐患

重启扫描前未确保旧的Disposable完全释放,延迟重启只是临时 workaround,未从根源解决问题。

4. 权限检查的潜在疏漏

虽然代码中检查了isScanRuntimePermissionGranted,但Android 12+需要BLUETOOTH_SCAN等专属权限,若权限未正确申请,可能间接触发扫描失败。

修复建议

1. 修复日志输出,获取真实错误信息

修改onScanFailure方法,打印完整异常信息以定位问题:

private fun onScanFailure(throwable: Throwable) {
    val errorInfo = throwable.message ?: throwable.toString()
    Log.d("TAG", "onScanFailure $errorInfo")
    // 后续重启逻辑
}

通过真实错误类型(比如SCAN_FAILED_ALREADY_STARTED、SCAN_FAILED_OUT_OF_HARDWARE_RESOURCES)可精准调整修复方案。

2. 规范Disposable管理

完善dispose()方法,确保资源正确释放:

private fun dispose() {
    scanDisposable?.dispose()
    scanDisposable = null
}

移除doFinally { dispose() },依赖RxJava自身的订阅生命周期管理即可。

3. 优化扫描重启逻辑

重启扫描前先释放旧资源,避免订阅冲突:

private fun onScanFailure(throwable: Throwable) {
    val errorInfo = throwable.message ?: throwable.toString()
    Log.d("TAG", "onScanFailure $errorInfo")
    dispose() // 先释放旧扫描资源
    viewModelScope.launch {
        delay(6000)
        startScan()
    }
}

可根据错误类型调整延迟时间(比如硬件资源不足时延长等待时长)。

4. 确认权限配置完整

在AndroidManifest.xml中添加对应系统版本的BLE权限:

<!-- Android 12+ 必备权限 -->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />

<!-- 旧版本系统及需要基于定位的扫描(可选) -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

确保运行时已成功申请对应权限。

5. 优化扫描参数

若不需要过滤设备,可省略空的ScanFilter,直接调用:

rxBleClient.scanBleDevices(scanSettings)

空过滤器可能导致扫描负载过高,触发系统层面的扫描限制。

内容的提问来源于stack exchange,提问作者Teddy Consultant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 03:01:11