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

如何实现应用与已配对蓝牙设备的连接?附配对设备获取代码

Hey Diego,我来帮你搞定这个蓝牙连接的需求!你已经成功获取了已配对设备的列表,接下来咱们一步步实现像示例图那样的点击连接功能:

实现蓝牙配对设备连接功能

1. 先搞定必要的权限配置

首先要在AndroidManifest.xml中添加蓝牙相关权限,不同Android版本的权限要求略有不同:

<!-- 基础蓝牙权限 -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<!-- Android 12+ 额外需要的连接权限 -->
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />

2. 把配对设备展示成列表(对应示例图的样式)

你之前的代码用Toast展示设备,现在我们把设备做成可点击的列表,这里用ListView举例子:

布局文件添加ListView

<ListView
    android:id="@+id/paired_devices_list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:divider="@android:color/darker_gray"
    android:dividerHeight="1dp"/>

Activity中初始化并绑定列表数据

// 获取蓝牙适配器
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null) {
    Toast.makeText(this, "当前设备不支持蓝牙功能", Toast.LENGTH_SHORT).show();
    return;
}

// 获取所有已配对的蓝牙设备
Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
List<String> deviceDisplayNames = new ArrayList<>();
// 保存设备对象,后续连接要用到
List<BluetoothDevice> deviceList = new ArrayList<>(pairedDevices);

// 整理设备显示文本(名称+MAC地址,更清晰)
for (BluetoothDevice device : pairedDevices) {
    deviceDisplayNames.add(device.getName() + "\n" + device.getAddress());
}

// 绑定列表数据
ListView deviceListView = findViewById(R.id.paired_devices_list);
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, 
    android.R.layout.simple_list_item_1, deviceDisplayNames);
deviceListView.setAdapter(adapter);

3. 实现点击设备的连接逻辑

给ListView添加点击事件,点击后尝试连接目标蓝牙耳机:

deviceListView.setOnItemClickListener((parent, view, position, id) -> {
    BluetoothDevice targetDevice = deviceList.get(position);
    connectToBluetoothDevice(targetDevice);
});

// 蓝牙连接核心方法
private void connectToBluetoothDevice(BluetoothDevice device) {
    // 先检查Android 12+的连接权限
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_CONNECT) 
        != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, 
            new String[]{Manifest.permission.BLUETOOTH_CONNECT}, 1001);
        return;
    }

    try {
        // 音频设备常用的A2DP协议UUID,通用值为0000110B-0000-1000-8000-00805F9B34FB
        UUID audioUuid = UUID.fromString("0000110B-0000-1000-8000-00805F9B34FB");
        // 创建蓝牙Socket
        BluetoothSocket bluetoothSocket = device.createRfcommSocketToServiceRecord(audioUuid);
        
        // 取消蓝牙发现操作(如果正在进行),否则会拖慢连接速度
        mBluetoothAdapter.cancelDiscovery();
        
        // 开始连接(注意:实际开发中要把这步放到子线程,避免ANR)
        bluetoothSocket.connect();
        
        Toast.makeText(this, "成功连接到:" + device.getName(), Toast.LENGTH_SHORT).show();
        
        // 连接成功后可以保存Socket,用于后续的音频传输等操作
        // 比如获取输入输出流:InputStream inStream = bluetoothSocket.getInputStream();
        
    } catch (IOException e) {
        e.printStackTrace();
        Toast.makeText(this, "连接失败:" + e.getMessage(), Toast.LENGTH_SHORT).show();
    }
}

4. 一些重要的注意事项

  • 权限处理:Android 12及以上版本必须动态申请BLUETOOTH_CONNECT权限,不能只靠Manifest声明
  • UUID适配:如果A2DP的UUID连接失败,可以试试HFP协议的UUID:0000111E-0000-1000-8000-00805F9B34FB(部分通话耳机用这个)
  • 子线程优化:上面的连接代码为了简化放在了主线程,实际开发中一定要把socket.connect()放到子线程(比如用AsyncTask或者Coroutine),避免阻塞主线程导致ANR
  • 蓝牙状态检查:可以提前检查蓝牙是否开启,如果没开启可以引导用户打开:mBluetoothAdapter.enable()或者跳转到系统蓝牙设置

你想要的连接方式示例图如下:
连接方式示例

内容的提问来源于stack exchange,提问作者Diego

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:07:55