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
相关产品推荐
相关产品推荐

