Flutter创建文件夹并保存图片遇权限拒绝问题求助
Android外部存储权限拒绝问题解决方案
问题核心
你遇到的Permission denied (errno=13),是因为Android 10及以上版本引入了Scoped Storage机制,直接在外部存储根目录创建文件夹需要特殊权限,原有普通存储权限已无法覆盖这类操作。
解决方案步骤
1. 修正AndroidManifest.xml权限配置
添加适配不同版本的权限声明:
<!-- 基础读写权限(仅针对Android 9及以下) --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" /> <!-- Android 11+ 需申请的全局存储管理权限 --> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /> <application ... <!-- 兼容Android 10的Scoped Storage(可选,若需保留旧逻辑) --> android:requestLegacyExternalStorage="true">
2. 优化权限申请逻辑
根据Android版本针对性申请权限,并处理权限拒绝后的引导操作:
import 'package:permission_handler/permission_handler.dart'; import 'package:device_info_plus/device_info_plus.dart'; import 'package:flutter/services.dart'; void requestAllPermission() async { // 申请相机权限 var cameraStatus = await Permission.camera.status; if (!cameraStatus.isGranted) { await Permission.camera.request(); } // 处理存储权限 if (Platform.isAndroid) { final androidInfo = await DeviceInfoPlugin().androidInfo; if (androidInfo.version.sdkInt >= 30) { // Android 11+ 申请全局存储管理权限 var manageStatus = await Permission.manageExternalStorage.status; if (!manageStatus.isGranted) { final result = await Permission.manageExternalStorage.request(); if (result.isDenied) { // 引导用户到应用设置页开启权限 await openAppSettings(); } } } else { // Android 10及以下申请普通存储权限 var storageStatus = await Permission.storage.status; if (!storageStatus.isGranted) { await Permission.storage.request(); } } } }
3. 合规性替代方案(推荐)
MANAGE_EXTERNAL_STORAGE属于敏感权限,Google Play对其使用有严格限制(仅允许文件管理器、备份类等特定应用使用)。如果只是保存图片,建议使用应用专属外部存储目录,无需特殊权限:
import 'package:path_provider/path_provider.dart'; // 获取应用专属外部存储目录 String appExternalDir = (await getExternalStorageDirectory())!.path; String myNewBarcodeFolder = '$appExternalDir/images'; await Directory(myNewBarcodeFolder).create(recursive: true);
这个路径为/storage/emulated/0/Android/data/你的应用包名/files/images,符合Scoped Storage规范,不会触发权限问题。
额外检查
- 测试前卸载旧版本应用,避免权限缓存问题
- 权限申请后打印权限状态,确认是否成功授予
内容的提问来源于stack exchange,提问作者Ashish
相关产品推荐
相关产品推荐

