Kotlin中Bluetooth获取设备为Null致崩溃问题求助
解决Kotlin蓝牙广播中获取BluetoothDevice为Null的崩溃问题
我来帮你一步步排查并解决这个问题,你遇到的崩溃主要有两个潜在原因:获取的BluetoothDevice为Null,以及集合不可修改导致的后续异常,我们逐个击破:
1. 先搞定BluetoothDevice为Null的核心问题
你提到获取到的device总是Null,这大概率是广播接收器监听的Action不正确,或者没有正确提取Intent里的Extra字段。
检查广播注册的Action是否匹配
不同的蓝牙广播Action携带的Extra完全不一样:
- 如果是监听新设备发现,必须注册
BluetoothDevice.ACTION_FOUND,这个Action的Intent里才会携带BluetoothDevice.EXTRA_DEVICE字段。 - 如果是监听设备配对状态变化,要注册
BluetoothDevice.ACTION_BOND_STATE_CHANGED,这个Action的Intent里同时包含BluetoothDevice.EXTRA_DEVICE和BluetoothDevice.EXTRA_BOND_STATE。 - 要是你注册的是其他不相关的Action,自然拿不到有效的BluetoothDevice对象。
注册广播时一定要用对应Action,比如:
val filter = IntentFilter(BluetoothDevice.ACTION_FOUND) registerReceiver(mBroadcastReceiver, filter)
做严格的空安全校验
就算Action正确,也可能出现Intent或Extra为空的情况,所以要做多层空判断,彻底避免NullPointerException:
mBroadcastReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { // 先校验Intent和Action是否匹配 intent?.takeIf { it.action == BluetoothDevice.ACTION_FOUND }?.let { validIntent -> val device = validIntent.getParcelableExtra<BluetoothDevice>(BluetoothDevice.EXTRA_DEVICE) // 确保device不为空再执行后续操作 device?.let { safeDevice -> pairedDevice.add(safeDevice) deviceAdapter.notifyDataSetChanged() // 别忘了通知Adapter更新UI } } } }
2. 解决集合不可修改的隐藏坑
你当前的pairedDevice是直接赋值的mBluetoothAdapter.bondedDevices,这个方法返回的是系统封装的不可修改Set集合——就算device不为Null,调用pairedDevice.add(device)也会抛出UnsupportedOperationException。
所以得先把它转换成可变集合,比如:
// 转换成可变Set,适配原有的集合类型 var pairedDevice = mutableSetOf<BluetoothDevice>().apply { addAll(mBluetoothAdapter.bondedDevices) } // 要是你的DeviceAdapter需要List类型,就换成mutableListOf: // var pairedDevice = mutableListOf<BluetoothDevice>().apply { addAll(mBluetoothAdapter.bondedDevices) }
3. 额外注意事项
- 确保你已经申请了对应权限:Android 12+需要
BLUETOOTH_SCAN、BLUETOOTH_CONNECT权限,部分旧设备还需要位置权限才能扫描蓝牙。 - 如果是监听配对状态变化,建议先判断配对是否成功(比如
validIntent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, -1) == BluetoothDevice.BOND_BONDED),再把设备添加到列表里,避免混入未配对成功的无效设备。
按照以上步骤调整后,应该就能解决崩溃问题了。
内容的提问来源于stack exchange,提问作者Lowkin
相关产品推荐
相关产品推荐

