如何实现应用与已配对蓝牙设备的连接?附配对设备获取代码
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
相关产品推荐
相关产品推荐

