You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 10及以上录音存储报错:Documents目录不被允许

Android 10+ 录制音频存储异常解决办法

异常提示明确说明:MediaStore.Audio.Media 对应的媒体库仅允许将音频文件存储在指定目录 [Alarms, Music, Notifications, Podcasts, Ringtones],你代码中使用的 Environment.DIRECTORY_DOCUMENTS(Documents目录)不在允许范围内,这才是抛出 IllegalArgumentException 的根源,修改 URI 获取方式无法解决问题。

解决方案

  1. 更换为允许的音频存储目录:将 RELATIVE_PATH 改为错误提示中列出的任意音频目录,比如通用的 Music 目录。
  2. 匹配MIME类型与输出格式:你设置的输出格式是 THREE_GPP,对应的MIME类型应为 audio/3gpp,而非 audio/mpeg,避免格式不匹配。
  3. 完善文件名与输出配置:给文件名添加对应格式后缀,并通过获取的 URI 为 MediaRecorder 设置输出文件。

修改后的完整代码

mRecorder = MediaRecorder()
with(mRecorder!!) {
    setAudioSource(MediaRecorder.AudioSource.MIC)
    setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP)
    setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB)
}

val values = ContentValues().apply {
    // 添加3gp后缀,方便系统识别文件格式
    put(MediaStore.MediaColumns.DISPLAY_NAME, "${System.currentTimeMillis()}.3gp")
    // 匹配THREE_GPP格式的正确MIME类型
    put(MediaStore.MediaColumns.MIME_TYPE, "audio/3gpp")
    // 使用允许的Music目录,自定义子目录mch
    put(
        MediaStore.MediaColumns.RELATIVE_PATH,
        "${Environment.DIRECTORY_MUSIC}/mch/"
    )
}

val resolver = applicationContext.contentResolver
val uri = resolver.insert(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, values)

// 为MediaRecorder设置输出文件描述符
uri?.let {
    val fd = resolver.openFileDescriptor(it, "w")?.fileDescriptor
    mRecorder?.setOutputFile(fd)
    // 后续执行录制流程
    mRecorder?.prepare()
    mRecorder?.start()
}

额外说明

如果必须将音频存储到 Documents 目录,不能使用 MediaStore.Audio.Media 的 URI,需改用**存储访问框架(SAF)**让用户手动选择目录,或使用 MediaStore.Documents 相关 API,但操作复杂度更高,适合需要自定义存储路径的场景。

内容的提问来源于stack exchange,提问作者JazBass

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 08:35:20