You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 手动检查系统权限

若权限仍显示拒绝,进入平板设置:

  1. 找到目标应用
  2. 进入「权限」选项
  3. 确保「蓝牙」分类下的「扫描」和「连接」权限均已开启

内容的提问来源于stack exchange,提问作者hurtstocode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 22:13:14