flutter_blue_plus与flutter_foreground_task结合锁屏后BLE扫描失效求助
锁屏后BLE扫描失效的解决尝试方案
问题描述
将flutter_foreground_task与BLE扫描功能结合后,应用在前台、后台运行时均正常,但锁屏后(日志出现I/FA (24762): Application backgrounded at: timestamp_millis: ...),所有扫描操作完全失效。无论是持续扫描,还是在onRepeatEvent中每6秒触发一次扫描(控制30秒内startScan调用不超过5次),都无法获取扫描结果。
已配置的权限:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" /> <uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_REMOTE_MESSAGING" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION"/> <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/> <uses-permission android:name="android.permission.USE_EXACT_ALARM"/> <uses-permission android:name="android.permission.VIBRATE"/> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
ForegroundService配置:
<service android:name="com.pravera.flutter_foreground_task.service.ForegroundService" android:foregroundServiceType="dataSync|remoteMessaging|connectedDevice" android:exported="false" android:stopWithTask="false" />
日志信息:
D/[FBP-Android](29081): [FBP] onMethodCall: startScan D/BluetoothAdapter(29081): isLeEnabled(): ON D/BluetoothLeScanner(29081): onScannerRegistered() - status=0 scannerId=19 mScannerId=0 [log] startScan [log] scanResults.listen(0)
可尝试的解决方法
调整前台服务类型为location
锁屏后BLE扫描需要位置类前台服务权限才能维持运行,修改配置:<service android:name="com.pravera.flutter_foreground_task.service.ForegroundService" android:foregroundServiceType="location" android:exported="false" android:stopWithTask="false" />同时在Flutter启动前台任务时指定对应类型:
await FlutterForegroundTask.startService( notificationTitle: 'BLE扫描中', notificationText: '正在监测设备', foregroundServiceType: ForegroundServiceType.location, );移除BLUETOOTH_SCAN的neverForLocation标记
部分Android设备会限制带有neverForLocation的BLE扫描在锁屏后的运行,尝试修改权限:<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />如需版本适配可拆分配置:
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" android:maxSdkVersion="33" /> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:minSdkVersion="34" />启用Partial唤醒锁
防止设备进入深度睡眠,启动前台任务时配置唤醒锁:await FlutterForegroundTask.startService( notificationTitle: 'BLE扫描中', notificationText: '正在监测设备', wakeLockType: WakeLockType.partial, foregroundServiceType: ForegroundServiceType.location, );优化扫描策略,添加过滤条件
只扫描目标设备的UUID或名称,减少系统资源占用,提升锁屏后扫描优先级:FlutterBluePlus.startScan( withServices: [Guid('目标设备UUID')], timeout: const Duration(seconds: 5), );引导用户添加电池优化白名单
即使申请了权限,仍需手动引导用户将应用加入白名单:final packageInfo = await PackageInfo.fromPlatform(); final intent = AndroidIntent( action: 'android.settings.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS', data: 'package:${packageInfo.packageName}', ); await intent.launch();检查厂商后台限制
国内小米、华为、vivo等厂商有独立后台管理机制,需引导用户开启应用的「后台运行权限」「自启动权限」「无限制后台耗电」等系统设置。
内容的提问来源于stack exchange,提问作者explodus
相关产品推荐
相关产品推荐

