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