Android 13 Photo/Video Picker:如何获取选中文件的真实文件名?
获取Photo Picker选中媒体的真实文件名
Android 13引入的ActivityResultContracts.PickVisualMedia选择器默认返回代理Uri,这类Uri对应的DISPLAY_NAME是系统生成的数字文件名,而非用户文件的真实名称。要获取真实文件名,有两种可行方案:
方案一:请求原始媒体Uri(Android 13+)
在构建选择器请求时添加setRequireOriginal(true)参数,让选择器返回原始的MediaStore Uri而非代理Uri,此时通过OpenableColumns.DISPLAY_NAME查询就能得到真实文件名。
示例代码:
val pickRequest = PickVisualMediaRequest.Builder() .setMediaType(PickVisualMedia.VideoOnly) // 按需设置媒体类型 .setRequireOriginal(true) .build() // 启动选择器 registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri -> uri?.let { // 查询真实文件名 contentResolver.query(it, arrayOf(OpenableColumns.DISPLAY_NAME), null, null, null)?.use { cursor -> if (cursor.moveToFirst()) { val realFileName = cursor.getString(0) // 使用真实文件名 } } } }.launch(pickRequest)
注意:该方案需要申请READ_MEDIA_VIDEO(视频)或READ_MEDIA_IMAGES(图片)权限,因为访问原始媒体Uri需要用户授权。
方案二:解析媒体文件元数据(兼容场景)
如果无法获取原始Uri权限,或需要兼容更低版本,可以通过打开文件流,解析媒体文件的元数据来提取真实文件名:
- 图片文件:读取Exif元数据中的文件名字段
- 视频文件:解析MP4等格式的文件头(如moov原子中的元数据)
这种方法需要自行处理不同媒体格式的解析逻辑,且并非所有文件都会存储原始文件名信息,可靠性不如方案一。
另外需要注意,Photo Picker的设计初衷是保护用户隐私,默认隐藏真实文件信息,因此如果没有用户明确授权,获取真实文件名会受到限制。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

