Android Q,如何使用MediaStore保存音频录制,并得到正确的文件名?

12
我希望将我的应用程序录制的MP3文件存储到Android 10的新“Scoped Storage”中的音乐文件夹中,使用MediaStore这个类。这种方法效果很好,但是文件名是以时间戳(例如1576253519449)命名的,并且没有.mp3扩展名。 如果我手动添加扩展名,文件将被正确记录。 我该如何使用fileName + ".mp3"来为文件命名?
String fileName; //Obtained by intent
MediaRecorder audioRecorder;
Uri audiouri;
ParcelFileDescriptor file;

private void startRecording() throws IOException {
    ContentValues values = new ContentValues(4);
    values.put(MediaStore.Audio.Media.TITLE, fileName);
    values.put(MediaStore.Audio.Media.DATE_ADDED, (int) (System.currentTimeMillis() / 1000));
    values.put(MediaStore.Audio.Media.MIME_TYPE, "audio/mp3");
    values.put(MediaStore.Audio.Media.RELATIVE_PATH, "Music/Recordings/");

    audiouri = getContentResolver().insert(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, values);
    file = getContentResolver().openFileDescriptor(audiouri, "w");

    if (file != null) {
        audioRecorder = new MediaRecorder();
        audioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        audioRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        audioRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
        audioRecorder.setOutputFile(file.getFileDescriptor());
        audioRecorder.setAudioChannels(1);
        audioRecorder.prepare();
        audioRecorder.start();
    }
}

在这里输入图片描述

另一个问题是:MediaStore.Audio.Media.RELATIVE_PATH 只适用于 Android 10。如何与早期版本保持兼容性?

编辑:
为了实现兼容性,您只需删除 values.put(MediaStore.Audio.Media.RELATIVE_PATH, "Music/Recordings/"); :文件将直接保存在 Music 目录中。
或者使用 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) 仅在 Android 10 上添加子目录。


4
请使用DISPLAY_NAME。 - blackapps
谢谢,它像魔法一般运行良好。 - devpelux
@blackapps 我在想如何使用媒体存储API来处理Android Q之前的设备? - Hossam Hassan
然后使用 .DATA 列。 - blackapps
@FirestormXYZ,我该如何在Android Q中创建新目录,就像WhatsApp一样,我想要的路径应该是**.../0/AudioRecording。这里的AudioRecording**是一个文件夹,我想要在其中存储我的录音文件。 - OMI HARISHCHANDRA MEHTA
1
对于Android 10和11,您可以在清单文件中的<application>元素中添加android:requestLegacyExternalStorage="true"。但是请开始将您的录音保存在专用应用程序文件夹中,因为在未来的Android版本中,即使使用此旧方法,您也将无法再创建文件夹。即使WhatsApp也将无法再这样做! - devpelux
1个回答

3
如@blackapps所建议,可以使用DISPLAY_NAME属性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接