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

Flutter下载图片到图库时permission_handler权限请求弹窗不出现怎么办

问题排查&解决步骤

1. 检查原生端权限配置

  • 安卓端(路径:android/app/src/main/AndroidManifest.xml)添加对应权限:

按你的目标安卓版本选择配置:
安卓12及以下:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

安卓13(API 33)及以上:

<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
  • iOS端(路径:ios/Runner/Info.plist)添加相册访问权限描述:
<key>NSPhotoLibraryAddUsageDescription</key>
<string>需要访问相册以保存下载的图片</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>需要访问相册以保存下载的图片</string>

2. 修正权限请求逻辑适配多系统版本

你当前固定请求Permission.storage的逻辑在安卓13+设备上无法生效,需要根据系统版本申请对应权限,修改后代码参考:

import 'package:device_info_plus/device_info_plus.dart';
import 'package:permission_handler/permission_handler.dart';

Future<List<dynamic>> _downloadFilesList(
    List<Future<Uint8List>> imagesRequests) async {
  PermissionStatus status;
  // 适配不同平台权限
  if (Platform.isAndroid) {
    final androidInfo = await DeviceInfoPlugin().androidInfo;
    if (androidInfo.version.sdkInt >= 33) {
      status = await Permission.photos.status;
      if (!status.isGranted) {
        status = await Permission.photos.request();
      }
    } else {
      status = await Permission.storage.status;
      if (!status.isGranted) {
        status = await Permission.storage.request();
      }
    }
  } else if (Platform.isIOS) {
    status = await Permission.photosAddOnly.status;
    if (!status.isGranted) {
      status = await Permission.photosAddOnly.request();
    }
  } else {
    status = PermissionStatus.granted;
  }

  // 处理永久拒绝权限的场景
  if (status.isPermanentlyDenied) {
    // 可自定义弹窗引导用户跳转到系统设置页开启权限
    openAppSettings();
    return [];
  }

  if (!status.isGranted) {
    // 权限未授予直接终止后续操作
    return [];
  }

  final List<Uint8List> files = await Future.wait(imagesRequests);

  return Future.wait(files
      .map(
        (f) => ImageGallerySaver.saveImage(
          f,
          quality: 100,
          name: '${getRandString(4)}.jpeg',
        ) as Future,
      )
      .toList());
}

上述代码用到了device_info_plus插件获取安卓系统版本,需要自行添加到pubspec.yaml依赖中。

3. 其他常见问题排查

  • 若之前测试时已经点过权限拒绝且勾选了「不再询问」,后续请求不会再弹出窗口,可卸载应用重装后测试
  • 确认你的项目compileSdkVersion和targetSdkVersion版本和权限配置匹配,5.x版本的permission_handler最低支持安卓API 16、iOS 9.0
  • 若你使用的Flutter版本高于3.0,建议将permission_handler升级到最新稳定版,老版本对新系统适配存在兼容问题

内容的提问来源于stack exchange,提问作者Kin Pu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 01:09:00