Android Kotlin新手:用ACTION_GET_CONTENT返回的Uri构建File报错
嘿,别慌!这个问题其实是Android文件访问机制里的一个常见小坑,我来给你掰扯清楚~
核心问题:Uri ≠ 文件路径
你用ACTION_GET_CONTENT拿到的Uri,可不是直接的本地文件路径哦!比如它常是content://开头的内容提供者Uri,指向的是系统媒体库或者其他应用共享的内容,而File()构造函数只认字符串格式的本地文件路径,自然会报「没有匹配的函数参数」错误。
而且从Android 10开始的分区存储政策,也限制了直接访问本地文件路径的权限,所以直接转File的路子根本走不通。
正确的TXT文件读取方式
既然要加载TXT内容,咱们直接通过ContentResolver读取Uri对应的内容就好,不用绕File这一步。给你两种常用的实现方式:
方式一:推荐用ActivityResultContracts(AndroidX新API)
这是Google现在推荐的方式,替代旧的onActivityResult:
// 先在Activity/Fragment里注册一个内容选择的Launcher private val txtFileLauncher = registerForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? -> uri ?: return@registerForActivityResult // 如果用户取消选择,直接返回 try { // 用ContentResolver打开输入流,读取TXT内容 contentResolver.openInputStream(uri)?.use { inputStream -> val txtContent = inputStream.bufferedReader().readText() // 这里把读取到的内容显示出来,比如给TextView赋值 yourTextView.text = txtContent } } catch (e: IOException) { e.printStackTrace() // 处理读取失败的情况,比如弹个Toast提示用户 Toast.makeText(this, "读取文件失败", Toast.LENGTH_SHORT).show() } } // 你的showFileDialog方法改成这样 fun showFileDialog() { // 指定只选择文本类型的文件 txtFileLauncher.launch("text/plain") }
方式二:旧版onActivityResult(兼容老项目)
如果你的项目还在使用旧的API,可以这样处理:
private val REQUEST_CODE_PICK_TXT = 1001 fun showFileDialog() { val intent = Intent(Intent.ACTION_GET_CONTENT).apply { type = "text/plain" addCategory(Intent.CATEGORY_OPENABLE) } startActivityForResult(intent, REQUEST_CODE_PICK_TXT) } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == REQUEST_CODE_PICK_TXT && resultCode == RESULT_OK) { data?.data?.let { uri -> try { contentResolver.openInputStream(uri)?.use { inputStream -> val txtContent = inputStream.bufferedReader().readText() yourTextView.text = txtContent } } catch (e: IOException) { e.printStackTrace() Toast.makeText(this, "读取文件失败", Toast.LENGTH_SHORT).show() } } } }
总结一下
别再想着把Uri转成File啦,直接用ContentResolver读取内容才是符合Android规范的做法,不管是TXT还是其他小文件,都可以用这个思路处理~
内容的提问来源于stack exchange,提问作者0ptl
相关产品推荐
相关产品推荐

