Android中getExternalStorage系列方法废弃后如何无需交互访问DCIM、Downloads文件
Android 公共目录无交互访问实现方案
针对getExternalStorageDirectory()、getExternalStoragePublicDirectory()等方法废弃后的存储访问问题,可按应用类型和适配系统版本选择对应方案,不需要用户手动选择目录即可实现图库、文件管理器类的访问效果:
1. 图库/媒体类应用实现方案(仅需访问图片、视频、音频)
这类应用不需要申请特殊权限,仅用常规媒体权限即可直接读取DCIM、Pictures、Movies等公共媒体目录文件:
- API 33(Android 13)及以上:申请对应细分媒体权限即可,权限声明如下:
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" /> - API 29-32(Android 10-12):申请
READ_EXTERNAL_STORAGE权限即可,可额外添加android:requestLegacyExternalStorage="true"到application标签做兼容。 - API 28及以下:申请
READ_EXTERNAL_STORAGE权限即可直接按路径访问。
权限授权通过后,建议通过MediaStoreAPI查询媒体文件,避免硬拼路径的适配问题,查询示例:
// 查询所有公共图片示例 val projection = arrayOf( MediaStore.Images.Media._ID, MediaStore.Images.Media.DISPLAY_NAME, MediaStore.Images.Media.DATA, MediaStore.Images.Media.SIZE ) contentResolver.query( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, null, null, "${MediaStore.Images.Media.DATE_ADDED} DESC" )?.use { cursor -> while (cursor.moveToNext()) { // 处理查询到的图片信息,可直接获取Uri或者文件路径读取内容 } }
2. 文件管理器类应用实现方案(需访问所有类型公共目录)
如果需要访问DCIM、Downloads、Documents等所有公共目录的任意类型文件,需要申请MANAGE_EXTERNAL_STORAGE全量存储权限:
- 首先在AndroidManifest.xml中声明权限:
<!-- Android 11+ 全量存储权限 --> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /> <!-- 低版本兼容 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" /> - 权限申请逻辑:
val REQUEST_CODE_MANAGE_STORAGE = 1001 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { if (!Environment.isExternalStorageManager()) { // 跳转到系统对应应用的权限授权页 val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION) intent.data = Uri.parse("package:${packageName}") startActivityForResult(intent, REQUEST_CODE_MANAGE_STORAGE) } else { // 已授权,可直接访问任意外部存储公共目录 } } else { // 低版本申请READ_EXTERNAL_STORAGE权限即可 }
注意:如果应用需要上架Google Play,
MANAGE_EXTERNAL_STORAGE权限仅开放给文件管理、备份、杀毒等确实需要全量存储访问的应用,普通媒体类应用不要申请该权限,否则会被拒审。
上述方案仅需要用户完成常规权限授权,不需要调用系统文件选择器手动指定目录,完全符合无额外交互直接访问公共目录的需求。
废弃API替代参考
| 废弃API | 替代方案 |
|---|---|
getExternalStorageDirectory() | 访问应用私有文件用context.getExternalFilesDir(type),访问公共目录按上述权限方案用MediaStore或者直接访问路径 |
getExternalStoragePublicDirectory(type) | 访问公共媒体文件用MediaStore对应Uri查询,全量权限下可直接用Environment.getExternalStoragePublicDirectory(type)获取路径(API 30+仍可使用该方法获取路径,只是无权限时读写会失败) |
内容的提问来源于stack exchange,提问作者SmartphonE_Codes
相关产品推荐
相关产品推荐

