如果 Android API 级别低于 26,如何将存储访问框架与 MediaMuxer 一起使用

Ahg*_*ubu 7 java android android-sdcard kotlin

我正在创建一个通过 Android MediaMuxer 进行录制的文件,并且我想将此文件存储在可移动 SD 卡中指定的任何文件夹中(不仅在 /Android/data/data/application 中)。

如果Android API级别高于26,我可以使用SAF(存储访问框架)来实现它。

var fd: FileDesciptor? = null

for (permission in activity.contentResolver.persistedUriPermissions) {
    if (permission.uri.path == "path/to/file") {
        val docFile = DocumentFile.fromTreeUri(activity, permission.uri)!!.
                createFile("video/mp4", "test.mp4")
        fd = activity.contentResolver.
                openFileDescriptor(docFile!!.uri, "w")!!.
                fileDesciptor
        break
    }
}

val muxer = MediaMuxer(fd, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4)
Run Code Online (Sandbox Code Playgroud)

但是文件描述符版本构造函数

var fd: FileDesciptor? = null

for (permission in activity.contentResolver.persistedUriPermissions) {
    if (permission.uri.path == "path/to/file") {
        val docFile = DocumentFile.fromTreeUri(activity, permission.uri)!!.
                createFile("video/mp4", "test.mp4")
        fd = activity.contentResolver.
                openFileDescriptor(docFile!!.uri, "w")!!.
                fileDesciptor
        break
    }
}

val muxer = MediaMuxer(fd, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4)
Run Code Online (Sandbox Code Playgroud)

如果 API 级别 < 26,则不可用。

只有文件路径版本

public MediaMuxer(@NonNull FileDescriptor fd, @Format int format) throws IOException 
Run Code Online (Sandbox Code Playgroud)

我可以用。

但我无法获得 SAF 许可的真实路径。

docFile.uri.path // this gives me a path with strange prefix.
Run Code Online (Sandbox Code Playgroud)

那么,如果 Android API 级别低于 26,有没有一种方法可以通过 MediaMuxer 在可移动 SD 卡中指定的任何文件夹中录制文件?

小智 0

我和你有同样的问题,没有任何帮助。但可能有一些解决方法。

您可以将文件录制到内部存储中,当录制结束时,您可以使用 SAF 将录制文件复制到可移动 SD 中