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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 02:22:37