【问题标题】:How to save file to external storage from link using Mediastore如何使用 Mediastore 从链接将文件保存到外部存储
【发布时间】:2021-04-25 11:51:11
【问题描述】:

我有一个带有 filePath 的音频类(它是指向 AWS S3 文件的音频文件的链接)。这是我的功能

fun download(audio: Audio) {
        val audioOutStream: OutputStream

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            val values = ContentValues()
            values.put(MediaStore.Audio.Media.DISPLAY_NAME, "${audio.title}.mp3")
            values.put(MediaStore.Audio.Media.MIME_TYPE, "audio/mpeg")
            values.put(
                MediaStore.Audio.Media.RELATIVE_PATH,
                "${Environment.DIRECTORY_MUSIC}/Soundy/"
            )
            val uri = context.contentResolver.insert(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, values)
            audioOutStream = context.contentResolver.openOutputStream(uri!!)!!
        } else {
            val audioPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).toString() + "/Soundy/"
            val audio = File(audioPath, audio.title!!)
            audioOutStream = FileOutputStream(audio)
        }

        audioOutStream.close()
    }

它保存音频,但这个文件不包含任何内容(它是 0 字节)。如何使用 Mediastore 从 Url 保存文件?我的安卓版本是11。

编辑 将我的代码更改为:

 fun download(audio: Audio) {
       val values = ContentValues()
        values.put(MediaStore.Audio.Media.DISPLAY_NAME, "${audio.title}.mp3")
        values.put(MediaStore.Audio.Media.MIME_TYPE, "audio/mpeg")
        values.put(
            MediaStore.Audio.Media.RELATIVE_PATH,
            "${Environment.DIRECTORY_MUSIC}/Soundy/"
        )
        val uri = context.contentResolver.insert(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, values)
        val audioOutStream = context.contentResolver.openOutputStream(uri!!)!!
        val request = Request.Builder().url(audio.filePath).build()
        val response = OkHttpClient().newCall(request).execute()
        val sink = Okio.buffer(Okio.sink(audioOutStream))
        sink.writeAll(response.body()!!.source())
        sink.close()
        audioOutStream.close()
    }

还是不行。

【问题讨论】:

    标签: java android kotlin mediastore


    【解决方案1】:

    那是因为你没有对audioOutStream 做任何事情,除了关闭它。如果你想写点什么,你就需要写点什么。例如,您可以use OkHttp to download the content and write it out。虽然该示例显示了写入File,但Okio 还在OutputStream 上提供了一个sink() 扩展功能供您使用。

    换句话说,回到你原来的代码,你会得到这样的东西:

    fun download(audio: Audio) {
            val audioOutStream: OutputStream
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                val values = ContentValues()
                values.put(MediaStore.Audio.Media.DISPLAY_NAME, "${audio.title}.mp3")
                values.put(MediaStore.Audio.Media.MIME_TYPE, "audio/mpeg")
                values.put(
                    MediaStore.Audio.Media.RELATIVE_PATH,
                    "${Environment.DIRECTORY_MUSIC}/Soundy/"
                )
                val uri = context.contentResolver.insert(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, values)
                audioOutStream = context.contentResolver.openOutputStream(uri!!)!!
            } else {
                val audioPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).toString() + "/Soundy/"
                val audio = File(audioPath, audio.title!!)
                audioOutStream = FileOutputStream(audio)
            }
    
            val request = Request.Builder().url(audio.filePath).build()
            val response = OkHttpClient().newCall(request).execute()
            val sink: BufferedSink = audioOutStream.sink().buffer()
    
            sink.writeAll(response.body()!!.source())
            sink.close()
    
            audioOutStream.close()
        }
    

    【讨论】:

    • 你能提供一个代码示例吗?只是我不确定如何将它与 audioOutStream 集成。
    • @DaniilAndreev:在 Kotlin 中,它将是 this,除了将 downloadedFile.sink().buffer() 替换为 audioOutStream.sink().buffer()
    • 非常感谢!你拯救了我的一天!
    • 对不起,这很愚蠢,但它仍然无法正常工作。
    • @DaniilAndreev:您添加的代码应该在您的if/else 之后。目前,您只能在else 中使用它。
    猜你喜欢
    • 2021-09-24
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-30
    • 2015-03-11
    • 2023-03-05
    • 1970-01-01
    相关资源
    最近更新 更多