Android 11/API 30 如何访问Android/data、media目录并列出文件
Android 11(API 30)访问Android/media/Android/data目录适配方案
近期在做Android 11(API 30)版本适配时,遇到了应用无法正常访问Android/media或Android/data目录的问题,目前已经找到实测可行的解决方案,整理如下供有相同问题的开发者参考。
注:我清楚不建议在主线程中加载大量Bitmap,本次相关操作仅为测试场景使用,生产环境请自行做好性能优化。
具体实现步骤
- 第一步:修改AndroidManifest.xml权限配置
除了常规的读写外部存储权限外,新增Android 11专属的全文件访问权限声明:<!-- 基础存储权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <!-- Android 11 专属全文件访问权限 --> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" android:maxSdkVersion="33" /> - 第二步:运行时申请权限
应用运行时先判断当前设备系统版本,若≥Android 11,先检查是否已经获取全文件访问权限,检查代码:boolean hasStoragePermission = Environment.isExternalStorageManager();
若未获取权限,跳转系统授权页引导用户开启权限,跳转代码示例:Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); intent.setData(Uri.parse("package:" + getPackageName())); startActivityForResult(intent, REQUEST_CODE_MANAGE_STORAGE); - 第三步:权限授予通过后,即可正常读写Android/media和Android/data目录下的文件资源。
注意事项
如果你的应用需要上架Google Play商店,请确保应用的核心功能必须依赖全文件访问权限才能正常运行,否则可能会被审核驳回。无特殊需求的场景下建议优先使用MediaStore或者存储访问框架(SAF)实现对应文件操作需求。
内容的提问来源于stack exchange,提问作者Marvin Stelter
相关产品推荐
相关产品推荐

