参考指定GitHub代码开发Android蓝牙控树莓派LED时遇运行时错误及崩溃
蓝牙控制树莓派LED应用崩溃排查方案
1. 权限问题排查
- 确保
AndroidManifest.xml中声明了全版本适配的蓝牙权限:<uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- Android 12+ 额外权限 --> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" /> - Android 6.0+必须动态申请位置、蓝牙连接/扫描权限,仅静态声明权限会直接触发权限异常导致崩溃。
2. 蓝牙IO线程问题
- 禁止在UI线程执行蓝牙连接、读写操作:将蓝牙相关逻辑放到子线程、
AsyncTask或协程中执行,Android主线程不允许耗时IO操作。 - 检查
BluetoothSocket创建与连接逻辑:确保调用createRfcommSocketToServiceRecord(UUID)时使用的UUID和树莓派端完全一致,常用串口UUID为00001101-0000-1000-8000-00805F9B34FB。
3. 空指针与异常捕获
- 在蓝牙设备获取、Socket连接、数据收发的代码块中添加
try-catch,捕获IOException、NullPointerException等常见异常,避免未捕获异常直接导致应用崩溃。 - 查看Logcat的
FATAL EXCEPTION日志,定位崩溃的具体类和方法,精准排查问题根源(比如未配对设备导致的设备对象为空、Socket连接超时)。
4. 树莓派端适配检查
- 确认树莓派蓝牙串口服务已开启:执行
sudo systemctl enable bluetooth和sudo rfcomm bind hci0 0命令完成配置。 - 检查树莓派端监听脚本的权限,确保
/dev/rfcomm0具备读写权限,可通过sudo chmod 666 /dev/rfcomm0临时授权。
5. 资源泄漏修复
- Activity销毁时,必须关闭蓝牙Socket、输入输出流,避免资源泄漏引发后续崩溃:
if (outputStream != null) { try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (socket != null && socket.isConnected()) { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } }
内容的提问来源于stack exchange,提问作者lemonJuice
相关产品推荐
相关产品推荐

