BluetoothSocket.connect无异常抛出但未成功连接ESP32问题求助
问题排查与解决思路
1 首要代码逻辑错误
你当前代码中最核心的问题是bluetoothAdapter.getRemoteDevice(address)调用后没有将返回的设备对象赋值给device变量,后续device?.createInsecureRfcommSocketToServiceRecord(uuid)属于空安全调用,device为空时后续逻辑不会执行,自然不会发起任何连接请求,所以ESP端没有收到连接记录、代码也不会抛出异常,最终socket为空触发末尾的Fail日志。
对应修复代码片段:
try { // 先判断address是否为空,避免未找到对应设备的情况 if(address.isNullOrEmpty()){ Log.e("Bluetooth", "未找到名为Test的配对设备") return } // 将获取到的远程设备赋值给device变量 val device = bluetoothAdapter.getRemoteDevice(address) socket = device.createInsecureRfcommSocketToServiceRecord(uuid) socket?.connect() } catch (e : IOException) { Log.e("Bluetooth", "Connection failed", e) // 建议打印异常栈便于排查 }
2 UUID不匹配问题
SPP协议通用的标准UUID为00001101-0000-1000-8000-00805F9B34FB,部分ESP32的蓝牙广播配置不规范时,从device.uuids取到的UUID可能不正确,你可以直接硬编码该标准UUID测试:
// 替换原来的uuids?.get(0)?.uuid取值逻辑 val uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")
3 权限与运行环境检查
- 权限校验:Android 12及以上系统需要动态申请
BLUETOOTH_SCAN、BLUETOOTH_CONNECT权限,Android 11及以下需要动态申请位置权限、BLUETOOTH、BLUETOOTH_ADMIN权限,权限不全时蓝牙操作会静默失败,不会抛出异常。 - 线程要求:蓝牙
connect()是阻塞操作,不能在主线程执行,需要放到子线程或者协程中运行,主线程执行会被系统直接拦截导致连接不发起。
调试建议
你可以在createInsecureRfcommSocketToServiceRecord和connect调用前加日志,确认这两行代码是否实际执行,就能快速定位是否是device为空导致的问题。
内容的提问来源于stack exchange,提问作者user8948406
相关产品推荐
相关产品推荐

