Flutter开发:Android 12下BLUETOOTH_SCAN权限异常问题求助
解决方案
1. 动态申请BLUETOOTH_SCAN权限
Android 12(API 31)及以上版本中,BLUETOOTH_SCAN属于危险权限,仅在AndroidManifest.xml中声明无法生效,必须在运行时向用户动态申请。
可以借助permission_handler包实现权限请求:
- 先在
pubspec.yaml添加依赖:
dependencies: permission_handler: ^10.2.0 # 可替换为最新版本
- 在启动BLE扫描前加入权限检查逻辑:
import 'package:permission_handler/permission_handler.dart'; Future<void> prepareBleScan() async { final scanPermissionStatus = await Permission.bluetoothScan.request(); if (scanPermissionStatus.isGranted) { // 权限通过,执行扫描操作 startBleScanning(); } else { // 权限被拒,引导用户前往设置页开启权限 openAppSettings(); } }
2. 配置正确的targetSdkVersion
确保Android项目的targetSdkVersion设置为31或更高(对应Android 12及以上),否则新的BLE权限规则不会被触发。
修改android/app/build.gradle中的配置:
android { defaultConfig { // ...其他配置 targetSdkVersion 33 // 31及以上版本均可 } }
3. 升级flutter_blue版本
旧版flutter_blue未适配Android 12的权限体系,建议升级到最新可用版本。另外注意:flutter_blue已停止维护,更推荐迁移到flutter_blue_plus(原项目分支,持续更新)。
修改pubspec.yaml依赖:
dependencies: # 升级flutter_blue flutter_blue: ^0.13.3 # 或替换为flutter_blue_plus # flutter_blue_plus: ^1.13.15
4. 权限声明细节检查
- 若你的应用无需通过BLE获取位置信息,
android:usesPermissionFlags="neverForLocation"的配置是正确的;若需要关联位置,需移除该标记,并动态申请ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION权限。 - 确认
AndroidManifest.xml的权限声明未被debug/release变体的配置覆盖。
内容的提问来源于stack exchange,提问作者ASMA
相关产品推荐
相关产品推荐

