Android Kotlin应用获取已配对蓝牙设备报错求助(HC-05)
解决Android获取已配对蓝牙设备列表的问题
你代码里的错误核心是直接调用了BluetoothAdapter.bondedDevices静态属性,但这个属性属于BluetoothAdapter实例,不是静态的,必须先拿到BluetoothAdapter的实例才能调用。
正确实现步骤
获取BluetoothAdapter实例
Android有两种兼容不同版本的获取方式:- 通用方式:
BluetoothAdapter.getDefaultAdapter() - Android 12(API 31)及以上:推荐通过
BluetoothManager获取,更符合新版本规范
- 通用方式:
检查蓝牙状态
如果蓝牙未开启,需要引导用户开启(可以调用系统弹窗请求开启)权限处理
必须在AndroidManifest.xml中声明权限,同时在运行时动态申请敏感权限:- Android 11及以下:声明
BLUETOOTH、BLUETOOTH_ADMIN - Android 12及以上:额外声明
BLUETOOTH_CONNECT并动态申请
- Android 11及以下:声明
修正后的完整代码示例
import android.Manifest import android.bluetooth.BluetoothAdapter import android.bluetooth.BluetoothDevice import android.bluetooth.BluetoothManager import android.content.Context import android.content.pm.PackageManager import androidx.core.app.ActivityCompat fun getPairedBluetoothDevices(context: Context): Set<BluetoothDevice>? { // 1. 获取BluetoothAdapter实例 val bluetoothManager = context.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager val bluetoothAdapter = bluetoothManager.adapter // 旧兼容写法:val bluetoothAdapter = BluetoothAdapter.getDefaultAdapter() // 设备不支持蓝牙直接返回null bluetoothAdapter ?: return null // 2. 检查蓝牙是否开启 if (!bluetoothAdapter.isEnabled) { // 可添加代码引导用户开启蓝牙,比如: // val enableBtIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE) // startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT) return null } // 3. 检查权限(Android 12+必须) if (ActivityCompat.checkSelfPermission( context, Manifest.permission.BLUETOOTH_CONNECT ) != PackageManager.PERMISSION_GRANTED ) { // 动态申请权限,比如在Activity中: // ActivityCompat.requestPermissions( // this, // arrayOf(Manifest.permission.BLUETOOTH_CONNECT), // REQUEST_BLUETOOTH_PERMISSION // ) return null } // 4. 正确获取已配对设备列表 return bluetoothAdapter.bondedDevices } // Activity中调用示例 fun fetchAndFilterHC05() { val pairedDevices = getPairedBluetoothDevices(this) pairedDevices?.forEach { device -> val deviceName = device.name ?: "未知设备" val deviceMac = device.address // 筛选HC-05设备 if (deviceName.contains("HC-05", ignoreCase = true)) { // 找到目标模块,后续可执行连接逻辑 } } }
关键提醒
- 永远不要直接调用
BluetoothAdapter的静态方法/属性,必须先获取实例 - 权限是硬要求,漏加或未动态申请会直接导致无法获取设备列表
- 筛选HC-05时,可通过设备名称或固定MAC地址精准匹配
内容的提问来源于stack exchange,提问作者Zack Myers
相关产品推荐
相关产品推荐

