Flutter 1.22.6使用image_picker访问图库遇权限已授权仍报错问题
解决方案
针对你遇到的PlatformException(photo_access_denied)问题,结合你的环境(Flutter 1.22.6 + image_picker ^0.6.7+22 + targetSdkVersion 33),可以从以下几个方面排查修复:
1. 修正AndroidManifest权限配置
你的Manifest里存在冗余无效权限(如android.permission.GALLERY并非Android官方权限),且未针对Android版本做权限区分,老版本image_picker无法正确识别Android 13的权限逻辑。修改为:
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.CAMERA" /> <!-- 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" /> <!-- Android 13+使用媒体图片权限 --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-feature android:name="android.hardware.location.network" android:required="false" /> <uses-feature android:name="android.hardware.location.gps" android:required="false" /> <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
2. 对齐compileSdkVersion与targetSdkVersion
当前compileSdkVersion 29低于targetSdkVersion 33,会导致权限相关API编译时不兼容,将compileSdkVersion调整为33:
android { compileSdkVersion 33 sourceSets { main.java.srcDirs += 'src/main/kotlin' } lintOptions { disable 'InvalidPackage' } defaultConfig { applicationId "com.example.label" minSdkVersion 16 targetSdkVersion 33 versionCode flutterVersionCode.toInteger() versionName flutterVersionName multiDexEnabled true } }
3. 手动适配权限请求逻辑
老版本image_picker未适配Android 13的READ_MEDIA_IMAGES权限,需在调用图库前手动根据Android版本请求对应权限(确保permission_handler版本适配,建议用^6.0.0+):
import 'dart:io'; import 'package:permission_handler/permission_handler.dart'; import 'package:image_picker/image_picker.dart'; import 'package:device_info_plus/device_info_plus.dart'; Future<void> pickGalleryImage() async { Permission targetPermission; if (Platform.isAndroid) { final androidInfo = await DeviceInfoPlugin().androidInfo; // Android 13及以上请求相册权限 if (androidInfo.version.sdkInt >= 33) { targetPermission = Permission.photos; } else { // 低版本请求存储权限 targetPermission = Permission.storage; } } else { targetPermission = Permission.photos; } final permissionStatus = await targetPermission.request(); if (permissionStatus.isGranted) { // 调用图库选图 final pickedFile = await ImagePicker().getImage(source: ImageSource.gallery); if (pickedFile != null) { // 处理图片逻辑 } } else { // 权限拒绝提示 } }
4. 彻底清理缓存
除了flutter clean,还需:
- 删除
android/build文件夹 - 执行
flutter pub get重新拉取依赖 - 重启IDE后重新编译项目
内容的提问来源于stack exchange,提问作者Betselot Semaw
相关产品推荐
相关产品推荐

