升级Flutter Blue Plus至1.32.8后Android端BLE无扫描结果求助
问题描述
应用在Flutter Blue Plus 1.5.2版本可正常获取周边BLE设备,升级至1.32.8版本(因适配Android 14强制升级)后,Android端无法获取任何扫描结果。日志显示turnOn()返回false,但蓝牙状态为BluetoothAdapterState.on。
已尝试将targetSdkVersion降级至33、替换为Flutter Blue Plus官方Demo测试,均无扫描结果。
相关代码
// handle bluetooth on & off // note: for iOS the initial state is typically BluetoothAdapterState.unknown // note: if you have permissions issues you will get stuck at BluetoothAdapterState.unauthorized // _bluetoothOnOffStreamSubscription?.cancel(); _bluetoothOnOffStreamSubscription ??= FlutterBluePlus.adapterState.listen((BluetoothAdapterState state) { debugPrint("Bluetooth is: $state"); if (state == BluetoothAdapterState.on) { // usually start scanning, connecting, etc } else { // show an error to the user, etc } }); // == Add read values listeners _scanResultsStreamSubscription ??= FlutterBluePlus.scanResults.listen( (List<ScanResult> results) { debugPrint('Scanning devices nearby: found ${results.length}'); if (!mounted) return; // == Add source devices to the list for (ScanResult result in results) { debugPrint( 'Device [${result.device.name}] found nearby! rssi: ${result.rssi}'); _addDeviceTolist(result); } if (results.length > 0) if (mounted) setState(() { // Force the refresh scanResultsCount += results.length; }); }, onError: (e) => print(e), ); // turn on bluetooth ourself if we can // for iOS, the user controls bluetooth enable/disable if (Platform.isAndroid) { await FlutterBluePlus.turnOn(); } FlutterBluePlus.startScan( // androidScanMode: AndroidScanMode.lowLatency, timeout: duration, ).catchError((e) { debugPrint("startScan exception: $e"); });
日志信息
D/[FBP-Android](14379): [FBP] onMethodCall: turnOn I/flutter (14379): Bluetooth is: BluetoothAdapterState.on I/flutter (14379): [FBP] <turnOn> result: false
排查思路与解决方案
1. 校验Android权限配置(适配Android 13+/14)
Flutter Blue Plus 1.32.8对Android权限要求与旧版本差异较大,需确保AndroidManifest.xml配置完整:
<!-- 旧版本兼容权限 --> <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" /> <!-- Android 12+ 核心BLE权限 --> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <!-- Android 13+ 扫描无名称/UUID设备需位置权限 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 声明BLE硬件依赖 --> <uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />
- 若仅扫描BLE设备,可给
BLUETOOTH_SCAN添加android:usesPermissionFlags="neverForLocation"减少权限弹窗,但部分设备仍需位置权限才能扫描到无标识设备。 - 必须在代码中动态申请权限,可使用
permission_handler库完成,不能仅依赖Manifest配置。
2. 解析turnOn()返回false的原因
turnOn()返回false常见场景:
- 硬件故障:测试系统蓝牙或其他蓝牙应用是否能正常开启并扫描,排除硬件问题。
- 权限缺失:即使蓝牙状态显示开启,缺少
BLUETOOTH_ADMIN或系统级权限会导致turnOn()失败,调用前需检查权限状态。 - 系统限制:Android 14部分设备限制应用直接控制蓝牙开启,建议调整逻辑:监听蓝牙状态,若为
off则弹窗引导用户手动开启,而非调用turnOn()。
3. 修正扫描触发逻辑
- 必须等待蓝牙状态完全切换为
BluetoothAdapterState.on后再启动扫描,而非turnOn()后立即执行,因为蓝牙开启是异步操作。修改代码如下:
_bluetoothOnOffStreamSubscription ??= FlutterBluePlus.adapterState.listen((BluetoothAdapterState state) { debugPrint("Bluetooth is: $state"); if (state == BluetoothAdapterState.on) { // 蓝牙稳定开启后启动扫描 _startScanning(duration); } else { // 提示用户开启蓝牙 } }); void _startScanning(Duration duration) async { if (!await FlutterBluePlus.isScanning) { await FlutterBluePlus.startScan( timeout: duration, ).catchError((e) { debugPrint("startScan exception: $e"); }); } }
- 增加扫描错误监听,定位扫描被拒原因:
FlutterBluePlus.scanResults.listen((results) { // 现有扫描结果处理逻辑 }, onError: (e) { debugPrint("扫描错误详情: $e"); });
4. 核对版本适配细节
- 查看Flutter Blue Plus 1.32.8更新日志,确认Android 14适配的变更点(如扫描模式、权限逻辑)。
- 确保
build.gradle配置正确:
android { compileSdkVersion 34 defaultConfig { targetSdkVersion 34 // 其他配置 } }
- 清理缓存后重新构建,排除依赖冲突:
flutter clean flutter pub get flutter run --debug
5. 多设备兼容性测试
不同品牌Android 14设备的蓝牙权限、扫描机制存在差异,可在小米、华为、三星等设备上测试,排查是否为设备特定问题。
内容的提问来源于stack exchange,提问作者Stéphane de Luca
相关产品推荐
相关产品推荐

