Android Studio:实现近距免配对蓝牙字符串传输,扫描代码失效
蓝牙无预配对字符串交换功能代码问题修正
核心实现前提
- 无需提前配对的蓝牙通信必须使用不安全RFCOMM通道,对应API为
listenUsingInsecureRfcommWithServiceRecord、createInsecureRfcommSocketToServiceRecord - 通信双方必须使用完全一致的固定UUID作为服务标识,不能随机生成
- 通信双方需处于蓝牙可发现状态,普通扫描状态下无法完成连接
当前代码的具体错误点
- 传参空指针:扫描广播回调中,创建
ClientClass实例时传入的pairing变量从未被赋值为当前扫描到的device对象,参数为null,客户端线程启动后直接崩溃 - Socket类型不匹配:客户端连接时使用了需要配对的安全RFCOMM socket(
createRfcommSocketToServiceRecord),即使服务端用了非安全通道,双方socket类型不匹配也无法建立无需配对的连接,需替换为createInsecureRfcommSocketToServiceRecord方法 - 逻辑顺序错误:每扫描到一个蓝牙设备就重复创建服务端、客户端线程,正常流程应仅启动一次服务端监听线程,客户端连接需在用户选中目标设备后再触发
- UUID不匹配问题:每次应用启动随机生成UUID,两台设备的服务标识不一致,蓝牙服务发现阶段无法匹配到可连接的服务
- 权限缺失:Android 12及以上系统需授予
BLUETOOTH_SCAN、BLUETOOTH_CONNECT运行时权限,无权限时扫描回调完全不触发,无法获取周边设备信息 - 广播泄漏风险:每次执行扫描流程都重复注册广播接收器,从未在页面销毁时取消注册,多次操作后会触发多接收器重复回调
- 连接流程阻塞:执行客户端连接前未主动取消正在进行的蓝牙扫描,扫描状态下系统会阻断RFCOMM连接建立,直接超时失败
- 写操作时机错误:广播回调中未等待socket连接建立完成就直接调用写方法,此时输出流对象未初始化,直接触发空指针异常
标准实现流程
- 应用启动后先申请所有蓝牙相关运行时权限,开启蓝牙后主动申请可发现模式,设置持续时长为300秒
- 全局定义双方约定好的固定UUID,替换原来随机生成的UUID逻辑
- 应用启动后启动一次服务端监听线程,持续等待其他设备的连接请求
- 扫描到周边设备后,将设备信息添加到列表展示;用户点击列表项的目标设备时,先取消当前正在运行的扫描任务,再启动客户端连接流程
- socket连接建立完成后,初始化读写通道,再通过输出流发送需要交换的唯一字符串;接收到对方发送的字符串后,通过Handler更新到界面
- 页面销毁时,取消广播接收器注册,关闭所有运行中的连接线程,释放socket占用的资源
内容的提问来源于stack exchange,提问作者Abd_Engineer
相关产品推荐
相关产品推荐

