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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 21:54:52