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

如何通过MediaStore访问设备中隐藏文件夹内的媒体文件?

如何通过MediaStore获取隐藏目录中的图片和视频

系统媒体扫描器默认会跳过以点开头的隐藏目录,因此这些目录内的媒体文件不会被MediaStore收录,这就是你的现有代码无法获取到它们的原因。以下是具体的解决方案:

权限配置

根据目标Android版本申请对应存储权限:

  • API 29及以下:在Manifest中添加权限声明,运行时申请READ_EXTERNAL_STORAGE:
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    
  • API 30及以上:添加MANAGE_EXTERNAL_STORAGE权限声明,并引导用户到系统设置开启「所有文件访问权限」:
    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
    

手动遍历存储获取隐藏目录媒体文件

由于MediaStore不会收录隐藏目录的文件,需要手动遍历外部存储,筛选出符合条件的媒体文件:

Kotlin示例代码

import android.content.Context
import android.os.Environment
import java.io.File
import java.util.Locale

// 定义需要筛选的图片/视频MIME类型
private val VALID_MEDIA_TYPES = setOf(
    "image/jpeg", "image/png", "image/gif", "image/webp",
    "video/mp4", "video/avi", "video/mkv", "video/webm"
)

fun getAllMediaIncludingHidden(context: Context): List<File> {
    val mediaFiles = mutableListOf<File>()
    val externalStorage = Environment.getExternalStorageDirectory()

    // 递归遍历目录
    fun scanDirectory(dir: File) {
        if (!dir.exists() || !dir.isDirectory) return

        val isHiddenDir = dir.name.startsWith(".")

        dir.listFiles()?.forEach { file ->
            if (file.isDirectory) {
                scanDirectory(file)
            } else {
                // 判断文件是否为图片/视频,且位于隐藏目录中
                getFileMimeType(file)?.let { mimeType ->
                    if (mimeType in VALID_MEDIA_TYPES && (isHiddenDir || file.parentFile?.name?.startsWith(".") == true)) {
                        mediaFiles.add(file)
                    }
                }
            }
        }
    }

    scanDirectory(externalStorage)
    return mediaFiles
}

// 根据文件扩展名获取MIME类型
private fun getFileMimeType(file: File): String? {
    val extension = file.extension.lowercase(Locale.getDefault())
    return when (extension) {
        "jpg", "jpeg" -> "image/jpeg"
        "png" -> "image/png"
        "gif" -> "image/gif"
        "webp" -> "image/webp"
        "mp4" -> "video/mp4"
        "avi" -> "video/avi"
        "mkv" -> "video/mkv"
        "webm" -> "video/webm"
        else -> null
    }
}

可选:合并MediaStore结果与手动遍历结果

如果需要同时获取系统收录的媒体文件和隐藏目录的文件,可以将现有Cursor查询到的文件列表与手动遍历得到的列表合并,通过文件路径去重后使用。

注意事项

  • 手动遍历存储耗时较长,务必在后台线程执行,避免阻塞主线程。
  • API 30+必须获取MANAGE_EXTERNAL_STORAGE权限才能完整遍历外部存储,否则会被限制访问部分目录。
  • 不要依赖MediaStore获取隐藏目录文件,系统扫描器不会处理这类目录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 12:23:22