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