Android 10及以上创建Environment.DIRECTORY_RECORDINGS目录的正确方法
Android 10+ 创建Recordings目录并通过MediaStore存储录音文件的正确方式
在Android 10(API 29)及以上的分区存储机制下,无法直接通过文件系统创建外部公共目录,但可以通过MediaStore API间接触发系统自动创建Environment.DIRECTORY_RECORDINGS指向的目录,具体实现如下:
核心实现思路
不需要手动创建目录,而是在向MediaStore插入文件元数据时,通过指定RELATIVE_PATH字段为Environment.DIRECTORY_RECORDINGS,让系统自动检测并创建目标目录(若不存在)。
具体代码示例
- 构建文件元数据的ContentValues,指定存储路径:
val contentValues = ContentValues().apply { put(MediaStore.Audio.Media.DISPLAY_NAME, "recording_${System.currentTimeMillis()}.m4a") put(MediaStore.Audio.Media.MIME_TYPE, "audio/mp4a-latm") // 指定相对路径,触发系统创建Recordings目录 put(MediaStore.Audio.Media.RELATIVE_PATH, Environment.DIRECTORY_RECORDINGS) put(MediaStore.Audio.Media.IS_PENDING, 1) // 标记为待处理,避免其他应用干扰写入 }
- 插入元数据到MediaStore,获取文件Uri:
val uri = contentResolver.insert(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, contentValues)
执行此步骤时,系统会自动检查Recordings目录是否存在,若不存在则直接创建,不会导致插入操作失败。
- 录音完成后,更新文件状态为已完成:
uri?.let { val updateValues = ContentValues().apply { put(MediaStore.Audio.Media.IS_PENDING, 0) } contentResolver.update(it, updateValues, null, null) }
关键注意事项
- Android 10+ 操作MediaStore公共目录无需申请
WRITE_EXTERNAL_STORAGE权限,仅需确保录音相关的RECORD_AUDIO权限已申请 - MIME类型需与录音文件格式匹配(如WAV对应
audio/wav,MP3对应audio/mpeg) - 避免硬编码目录名称,始终使用
Environment.DIRECTORY_RECORDINGS适配不同ROM的目录命名规则
内容的提问来源于stack exchange,提问作者Michau
相关产品推荐
相关产品推荐

