Flutter Android 13蓝牙扫描报错:需BLUETOOTH_SCAN权限求助
Android 13 蓝牙扫描权限异常解决方案
针对你遇到的Android 13上蓝牙扫描报BLUETOOTH_SCAN权限错误的问题,本质是Android 12(API 31)及以上系统对蓝牙权限做了拆分和权限等级提升,仅在AndroidManifest.xml中静态声明权限已经不够,必须配合动态权限申请和正确的权限flag配置,以下是具体解决步骤:
1. 修正AndroidManifest.xml权限声明
旧的BLUETOOTH、BLUETOOTH_ADMIN权限在API 31+已被废弃,需要给它们添加版本限制,同时给BLUETOOTH_SCAN添加权限flag(避免强制申请位置权限,除非你的业务需要基于位置的蓝牙扫描):
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 其他application代码不变 --> <!-- 旧蓝牙权限仅在API30及以下生效 --> <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30"/> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30"/> <!-- 蓝牙扫描权限,添加neverForLocation flag避免位置权限依赖 --> <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.ACCESS_FINE_LOCATION" android:maxSdkVersion="30"/> --> <!-- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" android:maxSdkVersion="30"/> --> </manifest>
2. 动态申请蓝牙权限
BLUETOOTH_SCAN和BLUETOOTH_CONNECT属于危险权限,必须在运行时向用户申请。我们可以使用permission_handler插件来简化权限申请流程:
步骤2.1 添加依赖
在pubspec.yaml中添加权限处理插件:
dependencies: flutter: sdk: flutter flutter_bluetooth_serial: ^0.4.0 permission_handler: ^10.2.0 # 可替换为最新版本
步骤2.2 修改扫描代码
在启动扫描前,先检查并申请权限,权限通过后再执行扫描逻辑:
import 'package:permission_handler/permission_handler.dart'; import 'package:flutter_bluetooth_serial/flutter_bluetooth_serial.dart'; void _startDiscovery() async { // 请求蓝牙扫描权限 final scanPermission = await Permission.bluetoothScan.request(); // 请求蓝牙连接权限(后续连接设备需要) final connectPermission = await Permission.bluetoothConnect.request(); if (scanPermission.isGranted && connectPermission.isGranted) { try { FlutterBluetoothSerial.instance.startDiscovery().listen((result) async { // 在这里实现你的去重逻辑,添加设备到列表 }); } on Exception catch (e) { print('扫描错误: $e'); } } else { // 权限被拒绝,提示用户并引导到设置页开启权限 print('蓝牙权限未授予,无法扫描设备'); await openAppSettings(); } }
3. 额外注意事项
- 如果使用
flutter_bluetooth_serial: ^0.4.0仍有兼容性问题,可以考虑替换为更活跃的蓝牙插件(如flutter_blue_plus),它对Android 12+的适配更完善。 - 测试时需要卸载旧版本应用重新安装,避免权限缓存导致的问题。
内容的提问来源于stack exchange,提问作者Ah Zeem khatib
相关产品推荐
相关产品推荐

