使用flutter_blue_plus扫描不到BLE设备,寻求解决方案
解决方案:FlutterBluePlus 扫描不到BLE设备的排查与修复
1. 核心问题:未触发扫描动作
你的代码仅监听了扫描结果流,但没有调用启动扫描的API。FlutterBluePlus 需要主动调用 startScan() 才会开始搜索BLE设备,添加这一步是关键。
2. 权限配置验证
确保项目已配置对应平台的BLE权限:
Android(AndroidManifest.xml)
添加以下权限:
<!-- 适配Android 12+ --> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" /> <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <!-- 适配Android 11及以下 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />
iOS(Info.plist)
添加蓝牙相关描述:
<key>NSBluetoothAlwaysUsageDescription</key> <string>需要蓝牙权限连接BLE设备</string> <key>NSBluetoothPeripheralUsageDescription</key> <string>需要蓝牙权限扫描BLE设备</string>
3. 修改后的代码示例
修复扫描启动逻辑,同时优化结果处理:
static void displayBleDevices() async { // 先检查蓝牙是否开启 if (await FlutterBluePlus.isOn == false) { print("蓝牙未开启,请打开蓝牙"); return; } // 监听扫描结果 var subscription = FlutterBluePlus.onScanResults.listen((results) { for (ScanResult result in results) { // 处理设备名称为空的情况 String deviceName = result.advertisementData.advName.isNotEmpty ? result.advertisementData.advName : "无名设备"; print('${result.device.remoteId}: "$deviceName" 信号强度: ${result.rssi}'); } }, onError: (e) => print("扫描错误: $e")); // 启动扫描(设置10秒后自动停止) await FlutterBluePlus.startScan(timeout: const Duration(seconds: 10)); // 扫描结束后取消订阅 FlutterBluePlus.cancelWhenScanComplete(subscription); }
4. 其他排查点
- 确认目标BLE设备处于可发现状态:部分设备需要手动开启广播/可发现模式
- 避免后台扫描限制:Android 12+ 后台扫描需要额外权限,测试时尽量保持APP在前台
- 检查FlutterBluePlus版本:确保使用最新稳定版,避免已知bug
内容的提问来源于stack exchange,提问作者karthikeyan
相关产品推荐
相关产品推荐

