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

Android 8+设备文件上传URI与文件名异常问题求助

Android 8+ 中正确获取文件选择后的URI与文件名

问题核心:ACTION_OPEN_DOCUMENT返回的是内容URI(content://开头),而非本地文件路径。直接用Uri.path获取的值并非真实文件路径,这就是实体设备上显示异常的原因。

正确解决方案:

  • 不要直接将Uri转成File对象:内容URI指向的是ContentProvider提供的数据,不一定对应本地文件系统的路径。
  • 通过ContentResolver查询文件名:利用ContentResolver查询MediaStore的DISPLAY_NAME字段获取真实文件名。
  • 直接使用ContentURI操作文件:读取文件时通过ContentResolver.openInputStream()获取输入流,而非操作File对象。

修正后的OnActivityResult代码:

if (requestCode == 1 && data != null) {
    val uri = data.data ?: return
    val fileNameTv = findViewById<TextView>(R.id.fileName)
    
    // 查询文件名
    val cursor = contentResolver.query(uri, arrayOf(MediaStore.MediaColumns.DISPLAY_NAME), null, null, null)
    cursor?.use {
        if (it.moveToFirst()) {
            val fileName = it.getString(it.getColumnIndexOrThrow(MediaStore.MediaColumns.DISPLAY_NAME))
            fileNameTv.text = fileName
            Log.d("TAG", "文件名: $fileName")
        }
    }
    
    // 直接记录完整的ContentURI,这是正确的标识
    Log.d("TAG", "正确的URI: ${uri.toString()}")
}

额外注意事项:

  • 若需要读取文件内容,使用contentResolver.openInputStream(uri)获取输入流,避免直接操作File。
  • Android 10及以下需确保已申请READ_EXTERNAL_STORAGE权限,Android 11+使用MediaStore或SAF无需额外权限。
  • 不要依赖Uri.path字段,ContentURI才是跨版本稳定的文件标识。

内容的提问来源于stack exchange,提问作者Anitha Mannem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 02:28:17