You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 04:01:21