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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:42:15