Flutter中解决「No permissions found in manifest for: []9」权限错误
权限问题导致Flutter应用无法访问相册并上传Firebase
我的Flutter应用原本能正常将文件上传到Firebase,但昨天开始无法显示文件。调用Permission.photos.request()时出现日志错误:No permissions found in manifest for: []9,控制台提示「Grant Permissions and try again」。相关上传代码和AndroidManifest.xml配置如下,求解决这个权限问题。
上传代码
uploadImage() async { final storage = FirebaseStorage.instance; final picker = ImagePicker(); PickedFile? image; //Check Permissions await Permission.photos.request(); var permissionStatus = await Permission.photos.status; if (permissionStatus.isGranted) { //Select Image image = await picker.getImage(source: ImageSource.gallery); var file = File(image!.path); final fileName = basename(file.path); final destination = 'user/$emaila/identitas/$fileName'; if (image != null) { //Upload to Firebase var snapshot = await storage .ref() .child(destination) .putFile(file) .whenComplete(() => null); var downloadUrl = await snapshot.ref.getDownloadURL(); setState(() { imageUrlidentitas = downloadUrl; }); } else { print('No Path Received'); } } else { print('Grant Permissions and try again'); } }
AndroidManifest.xml配置
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.rekammedis"> <uses-permission android:name="android.permission.INTERNET"/> <!-- Permissions options for the `storage` group --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" /> <!-- Permissions options for the `camera` group --> <uses-permission android:name="android.permission.CAMERA"/> <application android:label="rekammedis" 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"> <!-- Specifies an Android theme to apply to this Activity as soon as the Android process has started. This theme is visible to the user while the Flutter UI initializes. After that, this theme continues to determine the Window background behind the Flutter UI. --> <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> <!-- Don't delete the meta-data below. This is used by the Flutter tool to generate GeneratedPluginRegistrant.java --> <meta-data android:name="flutterEmbedding" android:value="2" /> </application> </manifest>
问题原因与修复方案
这个错误是因为Android 13+的权限模型变更,permission_handler库中的Permission.photos常量在高版本系统已失效,得针对不同Android版本适配对应权限。
1. 替换过时的权限请求逻辑
把Permission.photos换成版本适配的权限:
- Android 13及以上:用
Permission.images - Android 12及以下:用
Permission.storage(对应READ_EXTERNAL_STORAGE)
修改后的权限检查代码:
// 适配Android版本的权限请求 Permission permission; if (Platform.isAndroid) { final androidInfo = await DeviceInfoPlugin().androidInfo; if (androidInfo.version.sdkInt >= 33) { permission = Permission.images; } else { permission = Permission.storage; } } else { permission = Permission.photos; } await permission.request(); var permissionStatus = await permission.status;
2. 优化Manifest权限配置
你的Manifest里已经加了READ_MEDIA_IMAGES(Android13+)和READ_EXTERNAL_STORAGE(低版本),但可以移除冗余的WRITE_EXTERNAL_STORAGE(Android13+读取媒体文件不需要这个权限),同时给READ_EXTERNAL_STORAGE加上maxSdkVersion="32",避免高版本系统重复申请:
修改后的权限声明部分:
<uses-permission android:name="android.permission.INTERNET"/> <!-- Android 12及以下存储权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32"/> <!-- Android 13+媒体图片权限 --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <!-- 相机权限(如果需要保留) --> <uses-permission android:name="android.permission.CAMERA"/>
3. 完整修改后的上传代码
import 'dart:io'; import 'package:path/path.dart'; import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; import 'package:firebase_storage/firebase_storage.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:device_info_plus/device_info_plus.dart'; uploadImage() async { final storage = FirebaseStorage.instance; final picker = ImagePicker(); PickedFile? image; // 适配不同Android版本的权限请求 Permission permission; if (Platform.isAndroid) { final androidInfo = await DeviceInfoPlugin().androidInfo; if (androidInfo.version.sdkInt >= 33) { permission = Permission.images; } else { permission = Permission.storage; } } else { permission = Permission.photos; } await permission.request(); var permissionStatus = await permission.status; if (permissionStatus.isGranted) { // 选择图片 image = await picker.getImage(source: ImageSource.gallery); if (image != null) { var file = File(image.path); final fileName = basename(file.path); final destination = 'user/$emaila/identitas/$fileName'; // 上传到Firebase var snapshot = await storage .ref() .child(destination) .putFile(file) .whenComplete(() => null); var downloadUrl = await snapshot.ref.getDownloadURL(); setState(() { imageUrlidentitas = downloadUrl; }); } else { print('未获取到图片路径'); } } else { print('请授予权限后重试'); } }
4. 额外注意事项
- 确保
permission_handler库版本≥10.0.0,避免版本兼容问题 - 测试前卸载旧版本应用,清除缓存后重新安装
- iOS平台需在
Info.plist中添加NSPhotoLibraryUsageDescription,说明权限用途
内容的提问来源于stack exchange,提问作者Zanak
相关产品推荐
相关产品推荐

