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
相关产品推荐
相关产品推荐

