Android 13平板Flutter蓝牙扫描权限被拒问题求助
解决方案
1. 修正权限请求逻辑(核心问题)
Android 13(API 33)中,BLUETOOTH_SCAN 和 BLUETOOTH_CONNECT 是独立的危险权限,无法通过笼统的 Permission.bluetooth 请求。需要分别请求这两个权限:
修改权限请求代码如下:
void _startScan(BuildContext context) async { final bool hasScanPermission = await _requestBluetoothScanPermission(); final bool hasConnectPermission = await _requestBluetoothConnectPermission(); if (hasScanPermission && hasConnectPermission) { _scanAndConnect(context); } else { ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('蓝牙扫描或连接权限被拒绝')), ); } } Future<bool> _requestBluetoothScanPermission() async { var status = await Permission.bluetoothScan.status; if (status.isGranted) return true; if (status.isPermanentlyDenied) { openAppSettings(); return false; } final result = await Permission.bluetoothScan.request(); return result.isGranted; } Future<bool> _requestBluetoothConnectPermission() async { var status = await Permission.bluetoothConnect.status; if (status.isGranted) return true; if (status.isPermanentlyDenied) { openAppSettings(); return false; } final result = await Permission.bluetoothConnect.request(); return result.isGranted; }
2. 完善AndroidManifest.xml权限配置
针对Android 13,优化权限声明逻辑,确保权限标记匹配当前系统版本:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <!-- Android 11及以下基础蓝牙权限 --> <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" /> <!-- Android 12+ 蓝牙细分权限 --> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <!-- 仅针对Android 11及以下的位置权限 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" android:maxSdkVersion="30" /> <!-- 声明BLE硬件支持(可选,部分设备需此标记启用蓝牙功能) --> <uses-feature android:name="android.hardware.bluetooth_le" android:required="true" /> <!-- 若扫描无需关联位置信息,添加此标记避免位置权限依赖(Android 12+) --> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" /> </manifest>
注意:如果你的扫描场景需要通过蓝牙信号获取位置,不要添加
neverForLocation标记,此时需额外处理位置权限请求。
3. 确认依赖版本兼容性
确保permission_handler版本 ≥ 10.0.0(该版本开始支持Android 13的蓝牙细分权限),更新pubspec.yaml:
dependencies: permission_handler: ^10.2.0 # 或更高兼容版本 flutter_reactive_ble: ^5.0.0 # 保持与permission_handler版本匹配
4. 清理重建项目
- 执行
flutter clean清除缓存 - 卸载平板上的旧应用
- 重新运行
flutter run安装最新版本
5. 手动检查系统权限
若权限仍显示拒绝,进入平板设置:
- 找到目标应用
- 进入「权限」选项
- 确保「蓝牙」分类下的「扫描」和「连接」权限均已开启
内容的提问来源于stack exchange,提问作者hurtstocode
相关产品推荐
相关产品推荐

