Android 10及以上录音存储报错:Documents目录不被允许
Android 10+ 录制音频存储异常解决办法
异常提示明确说明:MediaStore.Audio.Media 对应的媒体库仅允许将音频文件存储在指定目录 [Alarms, Music, Notifications, Podcasts, Ringtones],你代码中使用的 Environment.DIRECTORY_DOCUMENTS(Documents目录)不在允许范围内,这才是抛出 IllegalArgumentException 的根源,修改 URI 获取方式无法解决问题。
解决方案
- 更换为允许的音频存储目录:将
RELATIVE_PATH改为错误提示中列出的任意音频目录,比如通用的Music目录。 - 匹配MIME类型与输出格式:你设置的输出格式是
THREE_GPP,对应的MIME类型应为audio/3gpp,而非audio/mpeg,避免格式不匹配。 - 完善文件名与输出配置:给文件名添加对应格式后缀,并通过获取的 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
相关产品推荐
相关产品推荐

