如何获取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
相关产品推荐
相关产品推荐

