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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 20:10:25