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

MediaStore中目录对应的MIME类型是什么?如何通过其API判断条目类型

问题解答

MediaStore是否存在专属目录MIME类型?

不存在。
SAF是专门为文档/目录访问设计的框架,所以提供了DocumentsContract.Document.MIME_TYPE_DIR(对应值vnd.android.document/directory)作为目录的统一MIME标识;但MediaStore的核心定位是索引设备上的媒体类文件,目录本身不属于媒体资源范畴,因此系统没有为目录分配专属的MIME类型,你查询时目录返回MIME_TYPE为null是系统默认行为,并非代码异常。

基于MediaStore API判断文件/目录的正确方式

不要通过MIME_TYPE == null判断目录,大量无后缀文件、系统无法识别格式的普通文件同样会返回MIME_TYPE为null,会造成大量误判,正确实现按系统版本分两种:

  • Android 10(API 29)及以上:使用内置IS_DIR列判断
    该版本开始MediaStore新增了MediaStore.Files.FileColumns.IS_DIR列,是官方提供的目录标识字段,查询时将该字段加入投影即可,值为1代表当前条目是目录,0代表是普通文件,判断结果完全准确,不需要额外存储权限。
    参考实现代码:
    val uri = MediaStore.Files.getContentUri("external_primary")
    // 加入IS_DIR列到查询投影
    val projection = arrayOf(
        MediaStore.Files.FileColumns.MIME_TYPE,
        MediaStore.Files.FileColumns.IS_DIR
    )
    val cursor = contentResolver.query(uri, projection, null, null, null)
    
    cursor?.use {
        val mimeColumn = it.getColumnIndexOrThrow(MediaStore.Files.FileColumns.MIME_TYPE)
        val isDirColumn = it.getColumnIndexOrThrow(MediaStore.Files.FileColumns.IS_DIR)
        while (it.moveToNext()) {
            val mimeType = it.getString(mimeColumn)
            val isDir = it.getInt(isDirColumn) == 1
            Log.e("MEDIA_STORE_ITEM", "mime type = $mimeType, is directory = $isDir")
        }
    }
    
  • Android 9(API 28)及以下:结合DATA列兼容判断
    低版本没有IS_DIR字段,可以在获取存储权限的前提下,查询MediaStore.Files.FileColumns.DATA列拿到条目对应的文件路径,再通过File(path).isDirectory判断是否为目录。注意该方式在分区存储限制下,对没有访问权限的路径会返回错误结果。

注意:如果你的应用需要频繁操作目录/非媒体文件,优先使用SAF框架实现,比MediaStore更适配这类场景。

内容的提问来源于stack exchange,提问作者Muhammed naseef Koppilakkal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.12 16:15:50