Flutter在Android 12中遇权限错误:/storage/emulated/0/Android/obb访问被拒
解决Android 12上Flutter访问/storage/emulated/0/Android/obb权限被拒问题
问题原因
Android 12(API 31)及以上系统对外部存储权限做了更严格的限制,/storage/emulated/0/Android/obb属于系统管理的特殊目录,仅允许系统应用或拥有特殊权限的应用访问,常规的READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE权限无法覆盖这个目录的访问需求。
解决方案
1. 添加特殊存储管理权限
在android/app/src/main/AndroidManifest.xml中添加MANAGE_EXTERNAL_STORAGE权限,该权限用于申请访问所有外部存储的权限:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" android:minSdkVersion="30" />
注意:这个权限属于特殊权限,无法仅通过代码动态申请直接获得,需要引导用户手动开启。
2. 动态申请权限并引导用户授权
使用permission_handler包处理权限申请逻辑,若权限未授予,跳转至应用设置页面让用户手动开启:
import 'package:permission_handler/permission_handler.dart'; import 'package:url_launcher/url_launcher.dart'; Future<void> checkAndRequestStoragePermission() async { final permissionStatus = await Permission.manageExternalStorage.status; if (!permissionStatus.isGranted) { final result = await Permission.manageExternalStorage.request(); if (!result.isGranted) { // 跳转至应用设置页面 await launchUrl(Uri.parse('app-settings:')); } } }
3. 优先使用应用专属目录替代(推荐)
如果你的业务不需要访问其他应用的OBB文件,建议使用Flutter提供的应用专属目录,这类目录无需额外权限即可读写:
import 'package:path_provider/path_provider.dart'; // 获取应用文档目录 Future<Directory> getAppDocumentsDir() async { return await getApplicationDocumentsDirectory(); } // 获取应用支持目录 Future<Directory> getAppSupportDir() async { return await getApplicationSupportDirectory(); }
内容的提问来源于stack exchange,提问作者Malik Hashir Awan
相关产品推荐
相关产品推荐

