Flutter 图像选择器明确请求 Android 版本 33 及更高版本或粒度媒体权限的许可

mew*_*ind 1 permissions android gallery dart flutter

Android 33及以上版本图库打不开且无请求权限。

当 Android 13 允许时 Permission.storage.request() 返回 permanentDenied

mew*_*ind 5

如果您的应用面向 Android 13 或更高版本,并且需要访问其他应用创建的媒体文件,则必须请求以下一项或多项精细媒体权限,而不是 READ_EXTERNAL_STORAGE权限

https://developer.android.com/about/versions/13/behavior-changes-13#capsular-media-permissions

Android 清单:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud)

此权限仅限照片和视频

<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/>
Run Code Online (Sandbox Code Playgroud)

pubspec.yaml:

device_info_plus: ^8.0.0
Run Code Online (Sandbox Code Playgroud)

清理并获取依赖项以避免应用程序崩溃

flutter clean && flutter pub get
Run Code Online (Sandbox Code Playgroud)

无论您的代码在哪里:

bool isStoragePermission = true;
bool isVideosPermission = true;
bool isPhotosPermission = true;

// Only check for storage < Android 13
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo;
if (androidInfo.version.sdkInt >= 33) {
  isVideosPermission = await Permission.videos.status.isGranted;
  isPhotosPermission = await Permission.photos.status.isGranted;
} else {
  isStoragePermission = await Permission.storage.status.isGranted;
}

if (isStoragePermission && isVideosPermission && isPhotosPermission) {
  // no worries about crash 
} else {
  // write your code here
}
Run Code Online (Sandbox Code Playgroud)