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

如何获取Android设备DCIM/Camera目录下的所有文件列表

问题根因

你调用的getExternalFilesDir()返回的是应用专属的外部存储空间路径,实际路径格式为Android/data/[你的应用包名]/files/DCIM/Camera,和系统公共的、存放系统相机拍摄内容的DCIM/Camera目录完全不属于同一个位置,这是你读不到文件的核心原因。

修复方案

方案1:直接访问公共存储路径(适配Android 10及以下/开启了legacy存储模式的场景)

首先修改路径获取逻辑,代码如下:

// 获取系统公共DCIM目录
val publicDcim = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)
val cameraDir = File(publicDcim, "Camera")

if (cameraDir.exists() && cameraDir.isDirectory) {
    val pics = cameraDir.listFiles()
    pics?.forEach {
        println(it.absolutePath)
    }
}

方案2:通过MediaStore查询(全版本适配,更推荐)

分区存储模式下更稳定的方案,不需要兼容路径差异:

val projection = arrayOf(
    MediaStore.Images.Media._ID,
    MediaStore.Images.Media.DISPLAY_NAME,
    MediaStore.Images.Media.DATA,
    MediaStore.Images.Media.RELATIVE_PATH
)
// 筛选DCIM/Camera目录下的图片
val selection = "${MediaStore.Images.Media.RELATIVE_PATH} = ?"
val selectionArgs = arrayOf("DCIM/Camera/")
val sortOrder = "${MediaStore.Images.Media.DATE_ADDED} DESC"

contentResolver.query(
    MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
    projection,
    selection,
    selectionArgs,
    sortOrder
)?.use { cursor ->
    while (cursor.moveToNext()) {
        val imgPath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA))
        println(imgPath)
    }
}

注意事项

  • 存储权限需要动态申请,不能仅在清单文件中声明:Android 6.0~12版本申请READ_EXTERNAL_STORAGE,Android 13及以上版本申请READ_MEDIA_IMAGES,权限未授予时listFiles()会返回空。
  • requestLegacyExternalStorage=true仅在Android 10~12版本生效,Android 13及以上版本该配置会被忽略,必须申请对应媒体权限或使用MediaStore查询。

内容的提问来源于stack exchange,提问作者now_world

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:45:02