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

Flutter:flutter_reactive_ble库权限在AndroidManifest中的正确放置位置

解决flutter_reactive_ble在Android Flutter应用中的权限配置问题

一、权限代码的正确放置位置

所有蓝牙权限代码必须放在<manifest>根标签内部,且位于<application>标签之前,不能嵌套在application标签里。

根据flutter_reactive_ble的要求,两段权限代码是配合使用的:

  1. 第一段是适配Android 11及以下版本的基础权限,同时给Android 12+设置扫描不关联位置的标记:
<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" />
  1. 第二段是针对Android 12+(API 31,代号S)的特殊配置,移除之前的neverForLocation标记,适配该版本的权限规则:
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" 
                 tools:remove="android:usesPermissionFlags"
                 tools:targetApi="s" />

注意:使用tools:属性需要在<manifest>标签中添加命名空间,否则会报错,修改后的manifest开头应为:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools">

结合你提供的main目录下的Manifest,最终修改后的完整配置如下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools">

    <!-- 基础权限配置 -->
    <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" />

    <!-- Android 12+ 特殊权限配置 -->
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" 
                     tools:remove="android:usesPermissionFlags"
                     tools:targetApi="s" />

    <application
        android:label="fl_ble_3"
        android:name="${applicationName}"
        android:icon="@mipmap/ic_launcher">
        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:launchMode="singleTop"
            android:theme="@style/LaunchTheme"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:hardwareAccelerated="true"
            android:windowSoftInputMode="adjustResize">
            <meta-data
              android:name="io.flutter.embedding.android.NormalTheme"
              android:resource="@style/NormalTheme"
              />
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <meta-data
            android:name="flutterEmbedding"
            android:value="2" />
    </application>
</manifest>

二、选择要编辑的Manifest文件

Flutter的三个Manifest目录分工明确:

  • main目录下的文件是核心基础配置,所有构建模式(debug、profile、release)都会继承这里的配置。
  • debug和profile目录下的文件仅用于对应模式的特殊配置(比如调试日志、测试权限),不需要重复添加蓝牙权限。

因此,只需要编辑main目录下的AndroidManifest.xml即可,无需修改另外两个文件,确保所有模式下权限都生效。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 22:32:49