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

