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

从已配对蓝牙设备匹配指定MAC地址的问题排查

蓝牙MAC地址配对检测问题修复

你代码里的几个关键问题

  1. 字符串比较用错了方法:Java里==比对的是字符串对象的内存地址,不是内容本身,必须用equals()方法来判断字符串内容是否一致。
  2. 错误获取字符串资源:String.valueOf(R.string.BT_MWAddress)得到的是资源ID的数字字符串(比如2131230720这类数值),并非你在strings.xml中定义的MAC地址。正确获取方式是用getResources().getString(R.string.BT_MWAddress)拿到实际的MAC字符串。
  3. 调试代码逻辑缺陷:循环中每次遇到不匹配的设备就把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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 11:02:41