Android开发:如何通过内容URI获取标题、MIME类型等文件详情
标准MediaStore URI的信息查询方案
你持有的content://media/external/images/media/161596是Android媒体存储体系的标准URI,本身不需要依赖MediaStore.MediaColumns里的URI类常量做映射,直接通过ContentResolver对该URI发起查询即可拿到所有存储在MediaStore里的元数据。
实现步骤
- 提前申请对应存储权限
- Android 12及以下:申请
READ_EXTERNAL_STORAGE - Android 13(API33)及以上:根据媒体类型申请细分权限,比如查图片需要
READ_MEDIA_IMAGES,查音频需要READ_MEDIA_AUDIO
- Android 12及以下:申请
- 定义需要查询的元数据列
常用的对应你需求的列常量:- 文件标题:
MediaStore.MediaColumns.DISPLAY_NAME - MIME类型:
MediaStore.MediaColumns.MIME_TYPE - 艺术家信息:
MediaStore.MediaColumns.ARTIST(图片文件的EXIF版权/作者字段、音频文件的专辑艺术家字段都会映射到这个列) - 其他扩展信息:文件大小、存储相对路径、拍摄时间、经纬度等,都可以从MediaStore的对应列常量中取值
- 文件标题:
- 直接以持有的URI为查询目标发起请求
核心实现代码(Kotlin版本):
val targetMediaUri = Uri.parse("content://media/external/images/media/161596") // 按需替换为你需要查询的列 val projection = arrayOf( MediaStore.MediaColumns._ID, MediaStore.MediaColumns.DISPLAY_NAME, MediaStore.MediaColumns.MIME_TYPE, MediaStore.MediaColumns.ARTIST, MediaStore.MediaColumns.SIZE, MediaStore.MediaColumns.RELATIVE_PATH ) contentResolver.query( targetMediaUri, projection, null, null, null )?.use { cursor -> if (cursor.moveToFirst()) { // 从Cursor中按列名读取对应值 val title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DISPLAY_NAME)) val mimeType = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.MIME_TYPE)) val artist = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.ARTIST)) } }
常见问题说明
MediaStore 的 MediaColumns 类本身没有内置URI类型的列常量,这就是你之前找不到
MediaStore.MediaColumns.URI的核心原因。MediaStore体系的所有标准内容URI,都是通过「MediaStore基础前缀 + 媒体条目_ID」拼接生成的,本身不需要从查询结果中反向读取。
- 如果查询返回空Cursor,优先检查是否已授予对应存储权限,以及目标媒体文件是否已被媒体扫描收录到MediaStore数据库
- 若需要读取更细粒度的EXIF参数(比如图片的拍摄设备、光圈值、白平衡参数),可在拿到MediaStore返回的文件绝对路径后,通过
ExifInterface类读取,无需走MediaStore查询链路 - 如果是跨应用通过SAF授权拿到的非MediaStore前缀的content URI,可通过
DocumentsContract解析对应元数据,和本方案逻辑不同
内容的提问来源于stack exchange,提问作者Sourav Kannantha B
相关产品推荐
相关产品推荐

