Flutter:flutter_reactive_ble库权限在AndroidManifest中的正确放置位置
解决flutter_reactive_ble在Android Flutter应用中的权限配置问题
一、权限代码的正确放置位置
所有蓝牙权限代码必须放在<manifest>根标签内部,且位于<application>标签之前,不能嵌套在application标签里。
根据flutter_reactive_ble的要求,两段权限代码是配合使用的:
- 第一段是适配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" />
- 第二段是针对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
相关产品推荐
相关产品推荐

