【问题标题】:Android 11 scoped storage how to store videos and gifAndroid 11 范围存储如何存储视频和 gif
【发布时间】: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


【解决方案1】:

固定为

@Throws(IOException::class)
    private fun writeImage(fileBytes: ByteArray, name: String, mediaType: String, fileExt: String) {
        val fos: OutputStream?
        val resolver = contentResolver
        val contentValues = ContentValues()
        val imageUri: Uri?
        if(mediaType == "image"){
            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/")
            imageUri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)
        } else {
            contentValues.put(MediaStore.Video.Media.DISPLAY_NAME, "$name.$fileExt")
            contentValues.put(MediaStore.Video.Media.MIME_TYPE, "$mediaType/$fileExt")
            contentValues.put(MediaStore.Video.Media.RELATIVE_PATH, Environment.DIRECTORY_MOVIES + "/LoliSnatcher/")
            imageUri = resolver.insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, contentValues)
        }

        if (imageUri != null){
            fos = resolver.openOutputStream(imageUri);
            fos?.write(fileBytes);
            Objects.requireNonNull(fos)?.close()
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 2020-07-07
    • 2021-12-27
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    相关资源
    最近更新 更多