You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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全量存储权限:

  1. 首先在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" />
    
  2. 权限申请逻辑:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 06:24:03