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

React Native Android应用配对BLE设备后崩溃问题求助

解决思路
  • 检查BLE相关广播接收器的注册与注销
    配对、蓝牙开关会触发系统广播(如ACTION_BOND_STATE_CHANGED、ACTION_BLUETOOTH_STATE_CHANGED),若react-native-ble-manager或自定义原生代码中注册了这些广播但未在onDestroy()中正确注销,可能导致ActivityThread处理广播时引用已销毁的Activity上下文,引发崩溃。

    • 打开Android原生项目的MainActivity.java,检查手动注册的广播接收器,确保在onDestroy()方法中调用unregisterReceiver()注销。
    • 尝试升级react-native-ble-manager到最新稳定版,旧版本可能存在广播管理的bug。
  • 阻止Activity因蓝牙状态变更重启
    崩溃日志指向ActivityThread.performLaunchActivity,说明Activity重启时出现异常。不要用super.onCreate(null)绕过状态恢复,正确做法是在AndroidManifest.xml的MainActivity标签中添加配置,避免系统因蓝牙相关变更重启Activity:

    <activity
      android:name=".MainActivity"
      android:configChanges="orientation|screenSize|keyboardHidden|bluetooth">
      <!-- 其他配置 -->
    </activity>
    
  • 调整createBond的调用时机与线程

    • 确保设备连接完全稳定后再调用createBond,比如在连接成功的回调触发后延迟1-2秒执行,避免连接未建立完成就触发配对。
    • 尝试在Android主线程中调用createBond,RN侧可通过UIManager实现:
      import { Platform, NativeModules } from 'react-native';
      import BleManager from 'react-native-ble-manager';
      
      if (Platform.OS === 'android') {
        NativeModules.UIManager.runOnUiThread(() => {
          BleManager.createBond(deviceId)
            .then(() => console.log('配对请求已发送'))
            .catch(err => console.error('配对失败:', err));
        });
      }
      
  • 排查Bond状态监听的原生逻辑

    • 若自定义了原生代码监听Bond状态变化,避免直接持有Activity引用,改用Application Context;同时确保在Activity销毁时移除所有RN回调。
    • 查看Sentry的完整崩溃栈,定位具体子异常(如空指针、内存泄漏),这能精准锁定问题根源。
  • 验证原生配对逻辑的兼容性
    编写简单的Android原生测试项目,直接连接BLE设备并调用createBond,若原生项目也崩溃,说明是设备或系统版本兼容性问题(部分Android 10/11版本存在BLE配对bug);若原生正常,则问题出在RN层的封装或交互逻辑。

  • 清理BLE缓存与旧配对记录

    • 清除应用的存储数据,重置BLE相关缓存。
    • 删除手机蓝牙配对列表中该设备的旧记录,重新进行连接配对测试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 13:07:21