【发布时间】:2021-02-02 14:14:29
【问题描述】:
我已经为我的应用程序添加了对存储 jpg 和 png 的支持,但我对如何让它适用于视频和 gif 文件有点困惑。我的应用程序是用 dart/flutter 编写的,但由于 dart/flutter 不支持它,所以使用 kotlin 进行 android 10+ 文件存储。在颤振方面,我通过 http get 请求获取文件,然后将响应正文作为字节数组发送到应用程序的 kotlin 部分。第一个函数接收字节数组并将其转换为位图,然后使用第二个函数将其写入磁盘。如何添加对视频和 gif 文件的支持?我写的视频文件很可能是webm和mp4
else if (call.method == "writeImage"){
var imageData = call.argument<ByteArray>("imageData");
val fileName = call.argument<String>("fileName");
val mediaType = call.argument<String>("mediaType");
val fileExt = call.argument<String>("fileExt");
var bmp = imageData?.size?.let { BitmapFactory.decodeByteArray(imageData,0, it) };
if (bmp != null && imageData != null && mediaType != null && fileExt != null && fileName != null){
print("writing file");
writeImage(bmp,fileName,mediaType,fileExt);
result.success(fileName);
} else {
print("a value is null");
result.success(null);
}
}
@Throws(IOException::class)
private fun writeImage(bitmap: Bitmap, name: String, mediaType: String, fileExt: String) {
val fos: OutputStream?
val resolver = contentResolver
val contentValues = ContentValues()
contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, "$name.$fileExt")
contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "$mediaType/$fileExt")
contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_PICTURES + "/LoliSnatcher/")
val imageUri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)
if (imageUri != null){
fos = resolver.openOutputStream(imageUri);
if (fileExt.toUpperCase() == "PNG"){
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
} else if (fileExt.toUpperCase() == "JPG" || fileExt.toUpperCase() == "JPEG") {
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos)
}
Objects.requireNonNull(fos)?.close()
}
}
【问题讨论】:
-
The first function receives the byte array and converts it to a bitmap这看起来不是一个好方法,因为为什么要从文件的字节中构造位图,可以将字节数组的内容直接保存到文件中?将它们直接写入该 OutputStream。这样,内容的类型也无关紧要,因为它们只是文件的字节。无论是 jpg、gif 还是 pdf。 -
我从另一篇文章中得到了这个功能,我认为媒体存储需要位图。如何将字节数组添加到输出流 fos?
-
fos.write (imageData); ?
-
好的,谢谢,它适用于 gif,但不适用于视频。我得到“java.lang.IllegalArgumentException:MIME 类型视频/mp4 无法插入到内容://media/external/images/media;image/* 下的预期 MIME 类型”我尝试将 uri 更改为“Environment.DIRECTORY_MOVIES”和还将解析器更改为“MediaStore.Video.Media.EXTERNAL_CONTENT_URI”,但这不起作用
-
嗯,我已经预料到了问题,你对这个问题的攻击看起来还不错。尝试更多。目前我无法测试或尝试您的代码,抱歉。模仿类型“video/*”
标签: android flutter kotlin dart