问题描述:安卓 11 使用 MediaRecorder 录制视频,由于新的分区存储特性(Scoped Storage,APP 产生的文件只能通过 MediaStore API 写入磁盘),存储路径无法直接使用外部 SD 卡的路径。
问题解决思路:
a. 使用应用内部存储路径 getExternalFilesDir(null), 真实路径为 "/storage/emulated/0/Android/data/<your package name>/"
视频录制完成后可以根据需要再写入分区存储。
-
由于内部存储路径又导致 MediaMetadataRetriever 获取视频第一帧的功能无法使用
- 解决思路:
media.setDataSource(getContentResolver().openFileDescriptor(Uri.fromFile(new File(urlPath)), "r").getFileDescriptor());
b. MediaRecorder 设置存储路径的方法 setOutputFile 可以接受 FileDescriptor 对象,利用 ContentResolver 和 MediaStore 获得外部存储路径的 FileDescriptor,就可以使用外部分区存储的路径录制了。
其他
a. 相关链接:安卓开发者文档-访问共享存储空间中的媒体文件
b. 相关链接:关于Android Q分区存储的一些适配心得
c. 相关链接:Android Q, how to save audio recording with MediaStore with the correct file name?
d. 个人网站:蜂鸟之歌