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

Android BLE开发:如何获取周边BLE设备的UUID?

BLE扫描获取设备UUID的Kotlin实现方案

问题描述

我正在开发一款通过BLE扫描返回周边设备列表的应用,每个设备对象包含两项信息:UUID(字符串类型)、rssi(整数类型)。目前能获取rssi值和设备地址,但无法正确获取UUID,找不到合适的Kotlin基础实现代码,现有资料多为Java代码,难以适配。我尝试了如下实现,但不确定是否正确:

现有实现代码

扫描设置

private val scanSettings = ScanSettings.Builder()
        .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
        .build()

扫描回调

private val scanCallback = object : ScanCallback() {
        @SuppressLint("MissingPermission")
        override fun onScanResult(callbackType: Int, result: ScanResult) {

            val listUUID = result.scanRecord?.serviceUuids
            if(listUUID != null){
                val parcelUuid =  listUUID[0]
                val device = Device(devUUID = parcelUuid.uuid.toString(), rssi = result.rssi)
                listDevice.add(device)
            }

        override fun onScanFailed(errorCode: Int) {
            Log.e("ScanCallback", "onScanFailed: code $errorCode")
        }
    }

启动扫描代码

bleScan.startScan(null, scanSettings, scanCallback)

方案验证与优化

你的实现思路是正确的,但有几个关键细节需要注意:

  • UUID获取逻辑:result.scanRecord?.serviceUuids仅能获取设备主动广播的服务UUID列表,如果设备未在广播包中携带UUID,这个列表会为空。这种情况下,若必须获取UUID,只能连接设备后通过BluetoothGatt查询服务,但会增加连接开销。
  • 空安全与多UUID处理:当前代码只取列表第一个UUID,建议优化为遍历所有UUID或根据业务需求筛选,同时强化空安全:
    result.scanRecord?.serviceUuids?.forEach { parcelUuid ->
        val device = Device(devUUID = parcelUuid.uuid.toString(), rssi = result.rssi)
        listDevice.add(device)
    }
    
  • 权限检查:Android 12及以上需确保已申请BLUETOOTH_SCAN、BLUETOOTH_CONNECT权限;低版本需申请ACCESS_FINE_LOCATION权限,否则扫描会失败。
  • 设备去重:扫描过程中会多次收到同一设备的结果,需根据UUID或设备地址对listDevice做去重处理,避免重复添加。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 03:57:01