使用Uri将文件保存在内部存储中(从Storage Access网络获得)

时间:2019-03-23 10:54:08

标签: android kotlin storage-access-framework

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

我正在获取URI,没有任何问题。就像content://com.android.providers.media.documents/document/image%3A141274

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

这是我正在使用的代码(获取URI之后)

val destinationFile = File("${context.filesDir.absolutePath}/$fileName")
try {
                        val writer = FileWriter(destinationFile)
                        writer.append(readTextFromUri(it))
                        writer.flush()
                        writer.close()

                    } catch (e: Exception) {
                        e.printStackTrace()

                    }


 @Throws(IOException::class)
    private fun readTextFromUri(uri: Uri): String {
        val inputStream = activity!!.contentResolver.openInputStream(uri)
        val reader = BufferedReader(InputStreamReader(inputStream))
        val stringBuilder = StringBuilder()
        var line: String? = null
        while ({ line = reader.readLine(); line }() != null) {
            stringBuilder.append(line)
        }
        inputStream?.close()
        reader.close()
        return stringBuilder.toString()
    }

1 个答案:

答案 0 :(得分:0)

正如@CommonsWare所述,我应该正确处理文件而不是文本。

正确的方法:

ffmpeg -i videoplayback.mp4 videoplayback.mp4 -filter_complex 
"[0:v]trim=end=1,setpts=PTS-STARTPTS,fade=t=in:d=1[intro];
[0:v]trim=start=1:end=123.39,setpts=PTS-STARTPTS[main];
[0:v]trim=start=123.39,setpts=PTS-STARTPTS,fade=t=out:d=1[end];
[1:v]trim=end=1,setpts=PTS-STARTPTS,fade=t=in:d=1[intro1];
[1:v]trim=start=1:end=123.39,setpts=PTS-STARTPTS[main1];
[1:v]trim=start=123.39,setpts=PTS-STARTPTS,fade=t=out:d=1[end1];
[0:a][1:a][a];
[intro][main][end][intro1][main1][end1]concat=n=6:v=1:a=1,scale=480x360,setsar=16/9[v]" -map "[v]" -map "[a]" -c:a copy output.mp4

或更长的方式(没有扩展功能)

private fun inputStreamToFile(uri: Uri){
        val inputStream = contentResolver.openInputStream(uri)
        val output = FileOutputStream(File("${filesDir.absoluteFile}/magic.png"))
        inputStream?.copyTo(output, 4 * 1024)
}