react-native-ble-plx在Android 9以下版本无法读取特征值问题求助
React Native BLE低版本安卓断连问题解决思路
运行错误:Disconnected from {deviceId} with status 22 (UNKNOWN)
调试报错:Error: Unknown error occurred. This is probably a bug! Check reason property
该报错为安卓8及以下系统原生蓝牙栈与react-native-ble-plx2.x版本默认配置不兼容导致,可按以下步骤排查解决:
- 调整连接参数
连接设备时关闭autoConnect配置,同时设置MTU为安卓低版本默认值23,示例代码:
安卓8及以下系统蓝牙栈对device.connect({ autoConnect: false, requestMTU: 23 })autoConnect的唤醒逻辑存在缺陷,主动请求超过23的MTU也会直接触发断连。 - 增加操作延迟
连接成功、服务发现完成后,不要立刻读取特征值,增加200~500ms的延迟再执行读写操作,适配低版本蓝牙栈的响应缓冲时间,示例代码:device.discoverAllServicesAndCharacteristics() .then(() => { setTimeout(() => { // 执行特征值读取逻辑 }, 300) }) - 补充权限兼容配置
在android/app/src/main/AndroidManifest.xml中添加低版本适配权限:
注意位置权限需要在应用运行时动态申请,仅在清单文件声明无效。<!-- 安卓8及以下蓝牙管理权限 --> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="27" /> <!-- 低版本蓝牙连接必需的位置权限 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> - 降级依赖版本
如以上操作无效,可将react-native-ble-plx降级到1.1.1版本,2.x版本底层依赖的安卓BLE库对低版本系统适配优化不足,1.1.1版本对RN 0.63.x的适配稳定性更高,低版本安卓兼容性更好。 - 校验特征值属性
读取特征值前确认目标特征值已开启READ属性,不要使用缓存的服务/特征值列表,每次连接后主动调用discoverAllServicesAndCharacteristics()获取最新的特征值列表再执行读取操作。
内容的提问来源于stack exchange,提问作者Aarthi Govardhanan
相关产品推荐
相关产品推荐

