Android设备蓝牙连接失败求助:服务端与客户端连接异常
嘿,从你的描述来看,你已经搞定了两台Android设备的蓝牙配对,客户端Galaxy S7(Android 7.0)也能搜到相机服务端(Android 7.1.2),但调用mmSocket.connect()时碰上个IO异常对吧?给你几个针对性的排查和解决思路:
1. 先盯紧服务端的UUID和监听逻辑
首先得确保服务端用的是完全一样的UUID:00001101-0000-1000-8000-00805F9B34FB(这是SPP蓝牙串口的默认UUID,大部分设备都会用)。服务端得正确开启RFCOMM监听,给你个参考代码片段:
BluetoothServerSocket mmServerSocket = mBluetoothAdapter.listenUsingInsecureRfcommWithServiceRecord("你的服务名称", UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")); // 开个线程等客户端连进来 new Thread(() -> { try { BluetoothSocket socket = mmServerSocket.accept(); // 连接成功后的逻辑写在这 } catch (IOException e) { e.printStackTrace(); } }).start();
另外要注意:如果服务端用的是安全连接的listenUsingRfcommWithServiceRecord,而客户端用的是非安全的createInsecureRfcommSocketToServiceRecord,两边模式不匹配也会连不上,得保持一致。
2. 搞定Android 7.0+的权限限制
Android 7.0(API 24)及以后对蓝牙权限卡得更严,你得在AndroidManifest.xml里把必要权限加全:
<!-- 基础蓝牙权限 --> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <!-- Android 6.0+必须要定位权限,因为蓝牙发现依赖定位服务 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
而且别忘了在运行时动态申请定位权限,不然系统会偷偷限制蓝牙的发现和连接功能。
3. 用反射绕过RFCOMM端口解析的坑
Android 7.0+有时候用createInsecureRfcommSocketToServiceRecord会出现端口解析失败的问题,你可以试试用反射直接指定RFCOMM端口来创建socket,兼容性会好很多:
// 替换你原来的socket创建代码 try { Method method = device.getClass().getMethod("createInsecureRfcommSocket", new Class[]{int.class}); mmSocket = (BluetoothSocket) method.invoke(device, 1); // 端口1是SPP常用端口,不行的话可以试试其他端口比如2、3 } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { e.printStackTrace(); }
这种方式绕开了系统的UUID服务解析,直接连指定端口,很多时候能解决莫名其妙的连接失败。
4. 连接前的几个小检查
- 确保调用
mmSocket.connect()之前,服务端已经启动监听了,别提前把BluetoothServerSocket关了 - 确认两台设备的蓝牙都是开着的,而且配对状态正常,别连接到一半设备蓝牙突然断了
- 一定要在子线程里执行连接操作!别在UI线程调用
connect(),不然不仅会触发ANR,还可能导致连接失败
5. 打印详细异常信息找根源
建议你把IO异常的详细栈信息打出来,比如:
catch (IOException e) { Log.e("BluetoothConnect", "连接失败原因: " + e.getMessage(), e); }
常见的原因比如服务端没监听、UUID不匹配、设备断连、权限不够等等,看详细的异常信息能帮你快速定位问题。
内容的提问来源于stack exchange,提问作者Varu

