Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用Uri(从存储访问网络获取)将文件保存在内部存储器中_Android_Kotlin_Storage Access Framework - Fatal编程技术网

Android 使用Uri(从存储访问网络获取)将文件保存在内部存储器中

Android 使用Uri(从存储访问网络获取)将文件保存在内部存储器中,android,kotlin,storage-access-framework,Android,Kotlin,Storage Access Framework,我正在使用存储访问网络来选择文件并保存在内部存储中,以便应用程序将来可以使用if 我得到的URI没有任何问题。有点像content://com.android.providers.media.documents/document/image%3A141274 当我试图将图像保存到内部目录时,问题出现了。代码通过时没有崩溃,相同大小的图像保存到内部目录中(我可以在设备资源管理器中看到它:)。 但图像本身已损坏,无法打开 下面是我正在使用的代码(获取URI后) 正如@commonware所描述的,我

我正在使用存储访问网络来选择文件并保存在内部存储中,以便应用程序将来可以使用if

我得到的URI没有任何问题。有点像content://com.android.providers.media.documents/document/image%3A141274

当我试图将图像保存到内部目录时,问题出现了。代码通过时没有崩溃,相同大小的图像保存到内部目录中(我可以在设备资源管理器中看到它:)。 但图像本身已损坏,无法打开

下面是我正在使用的代码(获取URI后)


正如@commonware所描述的,我应该正确处理文件,而不是文本

正确的做法:

private fun inputStreamToFile(uri: Uri){
        val inputStream = contentResolver.openInputStream(uri)
        val output = FileOutputStream(File("${filesDir.absoluteFile}/magic.png"))
        inputStream?.copyTo(output, 4 * 1024)
} 
或更长的路径(无扩展功能)


正如@commonware所描述的,我应该正确处理文件,而不是文本

正确的做法:

private fun inputStreamToFile(uri: Uri){
        val inputStream = contentResolver.openInputStream(uri)
        val output = FileOutputStream(File("${filesDir.absoluteFile}/magic.png"))
        inputStream?.copyTo(output, 4 * 1024)
} 
或更长的路径(无扩展功能)


您的代码用于读写文本。你的问题意味着你在读和写图像。图像不是文本。正确,我已经到了复制时内容被破坏的地步。因此,正确的问题是如何使用InputStream正确地复制到文件。使用
copyTo()
扩展函数将
InputStream
的内容复制到
OutputStream
:您的代码用于读写文本。你的问题意味着你在读和写图像。图像不是文本。正确,我已经到了复制时内容被破坏的地步。因此,正确的问题是如何使用InputStream正确地复制到文件。使用
copyTo()
扩展函数将
InputStream
的内容复制到
OutputStream
fun inputStreamToFile(uri: Uri){
        val inputStream = contentResolver.openInputStream(uri)
        inputStream.use {
            val directory = getDir("test", Context.MODE_PRIVATE)
            val file = File(directory, "correct.txt")
            val output = FileOutputStream(file)
            output.use {
                val buffer = ByteArray(4 * 1024) // or other buffer size
                var read: Int = inputStream?.read(buffer) ?: -1
                while (read != -1) {
                    output.write(buffer, 0, read)
                    read = inputStream?.read(buffer) ?: -1
                }
                output.flush()
            }
        }
    }