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
相关产品推荐
相关产品推荐

