从已配对蓝牙设备匹配指定MAC地址的问题排查
蓝牙MAC地址配对检测问题修复
你代码里的几个关键问题
- 字符串比较用错了方法:Java里
==比对的是字符串对象的内存地址,不是内容本身,必须用equals()方法来判断字符串内容是否一致。 - 错误获取字符串资源:
String.valueOf(R.string.BT_MWAddress)得到的是资源ID的数字字符串(比如2131230720这类数值),并非你在strings.xml中定义的MAC地址。正确获取方式是用getResources().getString(R.string.BT_MWAddress)拿到实际的MAC字符串。 - 调试代码逻辑缺陷:循环中每次遇到不匹配的设备就把
pair_status设为-1,哪怕之前已经找到过目标设备,只要最后一个配对设备不是目标,结果就会被覆盖成-1。
修正后的代码
基础功能版(正确检测配对状态)
Boolean pair_status = false; // 先获取正确的目标MAC地址 String targetMac = getResources().getString(R.string.BT_MWAddress); Set<BluetoothDevice> pairedDevices = BTAdapter.getBondedDevices(); if (pairedDevices.size() > 0) { for (BluetoothDevice device : pairedDevices) { // 用equals()比对MAC内容 if (targetMac.equals(device.getAddress())) { pair_status = true; // 找到目标设备后直接跳出循环,减少不必要的遍历 break; } } }
修复后的调试版
int pair_status = 0; String targetMac = getResources().getString(R.string.BT_MWAddress); Set<BluetoothDevice> pairedDevices = BTAdapter.getBondedDevices(); if (pairedDevices.size() > 0) { for (BluetoothDevice device : pairedDevices) { if (targetMac.equals(device.getAddress())) { pair_status = 1; // 找到目标后立即终止循环,避免结果被后续设备覆盖 break; } else { // 仅在未找到目标设备时,才更新状态为-1 if (pair_status != 1) { pair_status = -1; } } } }
额外提示
- 如果在非Activity/Fragment的类中获取字符串资源,需要传入Context对象,通过
context.getResources().getString(...)调用。 - 找到目标设备后使用
break跳出循环,能有效提升代码运行效率。
内容的提问来源于stack exchange,提问作者perpetualnoob
相关产品推荐
相关产品推荐

