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

b5lpy0ml  于 2023-01-03  发布在  Android
关注(0)|答案(1)|浏览(250)

如何将图像保存到FileProvider生成的文件中?我有一个名为getImageUri的方法,它返回指定路径中文件的Uri。我想将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())
xienkqul

xienkqul1#

好吧,这里有几件事:
1)来自文件提供者的URI不是一个文件(它可能是,但不一定是)。在任何情况下,试图将其作为文件打开都是不合适的。
2)即使它是一个文件,并且你有写它的权限,你使用的根文件夹也是完全错误的。com.myapp.test.fileprovider不是一个文件夹,它是一个类名,在那个参数中没有意义。
3)你为什么要在这里使用FileProvider呢?FileProvider是当你想向另一个Activity提供对文件的访问时使用的。如果你是这里唯一涉及的应用,只需使用文件名,而不是URI或提供程序。
4)无论如何,你都不会写这样的位图。如果文件不是空的,附加文件流会破坏它。如果文件是空的,就使用Bitmap.compress并传递一个输出流到那个文件,直接把它写到那个文件。调用outputStream.toByteArray几乎总是一个错误。

相关问题