Flutter使用permission_handler请求相册权限报错:No permissions found in manifest
解决Flutter Android13+访问相册权限被拒绝及Manifest权限未找到问题
你遇到的问题核心原因是permission_handler版本未适配Android13的权限模型,导致权限常量与Manifest声明的权限映射不匹配,触发"No permissions found in manifest"错误,最终权限请求被拒绝。以下是具体解决步骤:
升级permission_handler到最新稳定版
旧版本的permission_handler未对Android13新增的READ_MEDIA_IMAGES权限做映射,导致Permission.photos无法关联到正确的系统权限。在pubspec.yaml中指定最新稳定版本(如>=10.0.0),执行flutter pub get更新依赖。验证Manifest权限配置的正确性
你的Manifest配置逻辑正确,但要确保权限声明放在<manifest>标签下(而非<application>内部),且无拼写错误:<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 其他权限声明 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32"/> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/> <!-- 其他配置内容 --> </manifest>注意:
READ_MEDIA_IMAGES无需设置maxSdkVersion,仅在Android13+生效;READ_EXTERNAL_STORAGE通过maxSdkVersion="32"限制在Android12及以下生效,这是跨版本适配的正确写法。清理项目缓存并重新构建
Manifest修改可能因缓存未即时生效,执行以下命令清理后重新编译:flutter clean flutter pub get flutter run使用正确的权限请求逻辑
确保代码覆盖不同权限状态的处理:import 'package:permission_handler/permission_handler.dart'; Future<void> handlePhotosPermission() async { final permissionStatus = await Permission.photos.status; if (permissionStatus.isDenied) { final result = await Permission.photos.request(); if (result.isGranted) { // 权限已授予,执行相册访问操作 } else if (result.isPermanentlyDenied) { // 权限永久拒绝,引导用户到应用设置页开启 await openAppSettings(); } } else if (permissionStatus.isGranted) { // 已拥有权限,直接访问相册 } else if (permissionStatus.isPermanentlyDenied) { await openAppSettings(); } }测试注意事项
- 优先使用真实Android13+设备测试,部分模拟器存在权限模拟异常问题。
- 若之前手动拒绝权限并勾选"不再询问",需先到应用设置页手动开启权限,或卸载应用后重新安装测试。
内容的提问来源于stack exchange,提问作者Dilshod Shoolimkhonov
相关产品推荐
相关产品推荐

