随着移动设备功能的日益强大,音频录制与分享已经成为许多Android应用的重要功能之一。本文将详细阐述如何在Android平台上录制音频并将其保存至设备的媒体库中,便于用户通过系统自带的音乐播放器或其他第三方应用进行访问和播放。
首先,我们需要获取音频录制的权限。在AndroidManifest.xml中添加如下权限:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
接下来,我们将通过AudioRecord类进行音频的录制。以下是一个简单的音频录制并保存到媒体库的示例:
import android.media.MediaRecorder;
import android.os.Environment;
public class AudioRecorderActivity extends AppCompatActivity {
private static final int REQUEST_RECORD_AUDIO_PERMISSION = 200;
private MediaRecorder recorder;
private String audioFilePath;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 检查存储权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO)
!= PackageManager.PERMISSION_GRANTED ||
ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.RECORD_AUDIO, Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_RECORD_AUDIO_PERMISSION);
} else {
startRecording();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_RECORD_AUDIO_PERMISSION) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
startRecording();
} else {
Toast.makeText(this, "录音权限被拒绝", Toast.LENGTH_SHORT).show();
}
}
}
private void startRecording() {
// 创建MediaRecorder实例
recorder = new MediaRecorder();
// 设置音频源为麦克风
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
// 设置输出格式为AAC_ADTS,这是一种高效的音频编码格式
recorder.setOutputFormat(MediaRecorder.OutputFormat.AAC_ADTS);
// 设置音频编码方式
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
// 设置音频文件保存路径
audioFilePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC)
+ File.separator + "my_audio.aac";
// 设置输出文件
recorder.setOutputFile(audioFilePath);
try {
// 准备录制
recorder.prepare();
// 开始录制
recorder.start();
Log.d("AudioRecorder", "Recording started");
} catch (IOException e) {
e.printStackTrace();
}
}
// 结束录制并保存至媒体库
private void stopRecordingAndSaveToMediaLibrary() {
if (recorder != null) {
recorder.stop();
recorder.release();
recorder = null;
// 将音频文件添加至媒体库
MediaScannerConnection.scanFile(this,
new String[]{audioFilePath}, null,
new MediaScannerConnection.OnScanCompletedListener() {
@Override
public void onScanCompleted(String path, Uri uri) {
Log.i("AudioRecorder", "Audio file saved to media library: " + path);
}
});
}
}
}
在上述代码中,我们首先检查并请求录音和写入外部存储的权限,然后创建一个MediaRecorder
对象,设置音频源、输出格式、编码方式以及输出文件路径。开始录制后,当需要结束时,调用stop()
方法停止录制,并释放资源。最后,使用MediaScannerConnection
将新录制的音频文件添加到设备的媒体库中,这样,系统以及其他应用就能识别并访问该音频文件了。
注意:为了兼容不同Android版本的存储权限管理,在实际项目中还需要根据运行时权限API进行适配处理。同时,由于Android 10及以上版本对存储权限进行了更严格的限制,建议使用 Scoped Storage 或者 MediaStore API 进行音频文件的保存和读取。