将 Uri 转换为文件时缺少“文件”方案

Uri lacks 'file' scheme while converting Uri to File

提问人:BigBoss 提问时间:10/25/2023 更新时间:11/12/2023 访问量:48

问:

首先,我想澄清一下,这不是重复的。我已经浏览了 Stack Overflow 上具有类似主题但找不到解决方案的每个问题。我还浏览了文档,其中没有特别提到这个问题。

我正在尝试使用 Kotlin 将 Uri 转换为文件;但是,它会抛出一个错误,指出:.toFile()

java.lang.IllegalArgumentException: Uri lacks 'file' scheme: content://com.android.externalstorage.documents/document/primary%3Asample.txt
         at androidx.core.net.UriKt.toFile(Uri.kt:43)

我通过文件选择器访问了该文件,并且还请求了 .虽然可以选择该文件,但它会抛出我上面提到的错误。用于访问该文件的代码如下所示:READ_EXTERNAL_STORAGE

 val activityResultLauncher =
        rememberLauncherForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? ->
            val file = uri?.toFile()
            if (file != null) {
                Log.d("data file", file.readText())
            }
        }

我该如何解决这个问题?

谢谢。

Android Kotlin URI

评论

1赞 ianhanniballake 10/25/2023
“我正在尝试将 Uri 转换为文件”——这不是,也从来都不是,这是一件有效的事情,因为已经多次介绍过。使用 API 直接访问 Uri 的内容。

答:

0赞 BigBoss 11/12/2023 #1

好吧,如果有人仍然遇到同样的问题,您可以尝试以下代码:

 val activityResultLauncher =
        rememberLauncherForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? ->
            val file = createTempFile()
            uri?.let { context.contentResolver.openInputStream(it) }.use { input ->
                file.outputStream().use { output ->
                    input?.copyTo(output)
                }
            }
            Log.d("txt content", file.readText())
            file.delete()
        }

有关更多上下文,请参阅 https://stackoverflow.com/a/49221353/22091687