繁体   English   中英

将图像保存到 FileProvider 生成的文件中

[英]Save image into file generated by FileProvider

如何将图像保存到 FileProvider 生成的文件中? 我有一个名为getImageUri的方法,它返回指定路径中文件的Uri 我想将 append 字节的Bitmap放入该文件,但出现错误提示路径/文件不存在。 这里可能有什么问题?

文件提供者:

class ComposeFileProvider : FileProvider(R.xml.filepaths) {
companion object {
    fun getImageUri(context: Context): Uri {
        val directory = File(context.cacheDir, "images")
        directory.mkdirs()
        val file = File.createTempFile(
            "selected_image_",
            ".jpg",
            directory,
        )
        val authority = context.packageName + ".fileprovider"
        return getUriForFile(
            context,
            authority,
            file,
        )
    }
}
}

这是我如何尝试在生成的Uri中写入字节的代码

val outputStream = ByteArrayOutputStream()
val decoder = ImageDecoder.createSource(context.contentResolver, it)
val imageBitmap = ImageDecoder.decodeBitmap(decoder)

imageBitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream)

val uri = ComposeFileProvider.getImageUri(context)

File("com.myapp.test.fileprovider", uri.path)
    .appendBytes(outputStream.toByteArray())

好的,这里有几件事:

1) 来自文件提供者的 URI 不是文件(它可能是,但不一定是)。 在任何情况下,尝试将其作为文件打开都是不合适的。

2)即使它是一个文件,并且您有权写入它,您使用的根文件夹也是完全错误的。 com.myapp.test.fileprovider 不是文件夹。 它是一个类名,在该参数中没有意义。

3)你为什么要在这里使用 FileProvider? FileProvider 适用于当您想要向另一个活动提供对文件的访问权限时。 如果您是此处涉及的唯一应用程序,只需使用文件名,不要使用 URI 或提供商。

4)无论如何你都不会写一个 bitmap 。 如果文件不为空,附加文件 stream 会损坏它。 如果文件为空,只需使用 Bitmap.compress 并将其传递给该文件的 output stream 即可将其直接写入该文件。 调用 outputStream.toByteArray 几乎总是错误的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM