Flutter中Permission.photos请求失败,提示清单无对应权限
Flutter 图片选择权限请求报错:No permissions found in manifest for: []9
问题场景
实现本地图片选择功能时,权限请求环节出现日志错误:
D/permissions_handler( 1361): No permissions found in manifest for: []9
当前代码通过Permission.photos.request()请求相册权限,AndroidManifest已添加相关权限声明,但功能仍未正常工作。
核心原因
- 插件版本适配缺失:旧版
permission_handler未适配Android 13的READ_MEDIA_IMAGES权限,导致无法识别Manifest中的权限配置。 - 权限映射不匹配:
Permission.photos在Android 13+对应READ_MEDIA_IMAGES,而Android 12及以下对应READ_EXTERNAL_STORAGE,未区分版本请求会触发插件识别异常。 - 权限声明位置错误:若权限声明未放在
<manifest>根标签下、<application>标签外,插件无法读取到权限配置。
解决方案
1. 升级permission_handler插件到适配版本
确保pubspec.yaml中插件版本≥10.0.0(支持Android 13权限):
dependencies: permission_handler: ^10.2.0 # 或更高兼容版本
执行flutter pub get更新依赖。
2. 区分Android版本请求对应权限
修改权限请求逻辑,根据系统版本选择正确的权限类型:
import 'dart:io'; // 需导入此包判断平台 // ... 其他代码 _loadPermission() async { if (Platform.isAndroid) { final androidInfo = await DeviceInfoPlugin().androidInfo; if (androidInfo.version.sdkInt >= 33) { // Android 13及以上,请求相册权限 if (await Permission.photos.status != PermissionStatus.granted) { await Permission.photos.request(); } } else { // Android 12及以下,请求存储权限 if (await Permission.storage.status != PermissionStatus.granted) { await Permission.storage.request(); } } } else if (Platform.isIOS) { // iOS平台统一请求相册权限 if (await Permission.photos.status != PermissionStatus.granted) { await Permission.photos.request(); } } }
3. 修正AndroidManifest权限声明
确保权限声明放在<manifest>根标签下,且为Android 12及以下版本的存储权限添加maxSdkVersion限制:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 其他基础权限 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.VIBRATE"/> <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.INTERNET"/> <!-- Android 13+ 相册权限 --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/> <!-- Android 12及以下 存储权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32"/> <application ...> <!-- 应用组件配置 --> </application> </manifest>
4. 清理缓存并重新构建
执行以下命令清理项目缓存,避免旧配置残留影响:
flutter clean flutter pub get flutter build apk
内容的提问来源于stack exchange,提问作者Dev
相关产品推荐
相关产品推荐

