uni-app uni.startBluetoothDevicesDiscovery的services参数存在问题
uni-app uni.startBluetoothDevicesDiscovery的services参数存在问题
| 开发环境 | 版本号 | 项目创建方式 |
|---|---|---|
| PC | Windows11 专业版 | CLI |
产品分类:uniapp/App
PC开发环境操作系统:Windows
HBuilderX版本号:4.85
手机系统:Android
手机系统版本号:Android 15
手机厂商:小米
手机机型:15pro
页面类型:vue
vue版本:vue3
打包方式:云端
CLI版本号:3.0.0-4080520251106001
示例代码:
```js
uni.startBluetoothDevicesDiscovery({
services: ['A', 'B'],
})
uni.onBluetoothDeviceFound(e => {
console.log(e)
})
操作步骤:
- 情况1:当手机设备发起搜索后,附近的蓝牙设备同一时刻仅存在a或b时
- 情况2:当手机设备发起搜索后,如果附近的蓝牙设备同时存在a和b时
预期结果:
- 情况1:可以在onBluetoothDeviceFound发现搜索的设备信息,并且过滤了无关设备。
- 情况2:可以在onBluetoothDeviceFound发现搜索的设备信息,并且过滤了无关设备。
实际结果:
- 情况1:可以在onBluetoothDeviceFound发现搜索的设备信息,并且过滤了无关设备。
- 情况2:onBluetoothDeviceFound不会发现任何一台的设备信息。
- 在情况2的场景下,只有将其中一种蓝牙设备全部关闭,才能回到情况1正常发现蓝牙设备。
bug描述: 假设有2台要搜索的蓝牙设备a和b,其主 service 的 uuid 分别为A和B,2种设备同时在线时,搜索时都发现不了。
更多关于uni-app uni.startBluetoothDevicesDiscovery的services参数存在问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于uni-app uni.startBluetoothDevicesDiscovery的services参数存在问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
根据你的描述,这个问题确实属于uni.startBluetoothDevicesDiscovery的services参数在特定场景下的兼容性问题。
从技术实现来看,当services参数传入多个UUID时,Android底层蓝牙扫描可能会采用逻辑"与"的过滤策略,而非"或"逻辑。这意味着设备需要同时包含所有指定的UUID才会被返回,这在大多数蓝牙设备场景下是不合理的,因为单个外设通常不会同时包含多个不相关的服务。
建议的解决方案:
- 分次扫描策略:改为多次调用
startBluetoothDevicesDiscovery,每次只传入单个service UUID
// 先扫描A设备
uni.startBluetoothDevicesDiscovery({
services: ['A'],
success: () => {
uni.onBluetoothDeviceFound((e) => {
// 处理A设备
})
}
})
// 再扫描B设备
uni.startBluetoothDevicesDiscovery({
services: ['B'],
success: () => {
uni.onBluetoothDevicesDiscovery((e) => {
// 处理B设备
})
}
})
- 放弃services过滤:移除services参数,在
onBluetoothDeviceFound回调中手动过滤
uni.startBluetoothDevicesDiscovery()
uni.onBluetoothDeviceFound((e) => {
const device = e.devices[0]
// 检查设备advertisServiceUUIDs是否包含A或B
if (device.advertisServiceUUIDs?.includes('A') ||
device.advertisServiceUUIDs?.includes('B')) {
// 处理目标设备
}
})

