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

Android Kotlin应用获取已配对蓝牙设备报错求助(HC-05)

解决Android获取已配对蓝牙设备列表的问题

你代码里的错误核心是直接调用了BluetoothAdapter.bondedDevices静态属性,但这个属性属于BluetoothAdapter实例,不是静态的,必须先拿到BluetoothAdapter的实例才能调用。

正确实现步骤

  1. 获取BluetoothAdapter实例
    Android有两种兼容不同版本的获取方式:

    • 通用方式:BluetoothAdapter.getDefaultAdapter()
    • Android 12(API 31)及以上:推荐通过BluetoothManager获取,更符合新版本规范
  2. 检查蓝牙状态
    如果蓝牙未开启,需要引导用户开启(可以调用系统弹窗请求开启)

  3. 权限处理
    必须在AndroidManifest.xml中声明权限,同时在运行时动态申请敏感权限:

    • Android 11及以下:声明BLUETOOTH、BLUETOOTH_ADMIN
    • Android 12及以上:额外声明BLUETOOTH_CONNECT并动态申请

修正后的完整代码示例

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 17:35:30