Android手机一般都提供麦克风的硬件,而Android系统可以利用该硬件来录制音频。
为了在Android应用中录制音频,Android提供了MediaRecorder类,使用MediaRecorder录制音频的过程很简单,步骤如下:
Step1:创建MediaRecorder对象;
Step2:调用MediaRecorder对象的setAudioSource()方法设置声音来源,一般传入MediaRecorder.AudioSource.MIC参数指定录制来自麦克风的声音;
Step3:调用MediaRecorder对象的setOutputFormat()方法设置所录制的音频文件格式;
Step4:调用MediaRecorder对象的setAudioEncoder()、setAudioEncodingBitRate(int bitRate)、setAudioSamplingRate(int samplingRate)方法设置所录制的声音编码格式、编码位率、采样率等,这些参数将可以控制所录制的声音品质、文件大小。一般来说,声音品质越好,声音文件越大;
Step5:调用MediaRecorder的setOutputFile(String path)方法设置所录制的音频文件的保存位置;
Step6:调用MediaRecorder的prepare()方法准备录制;
Step7:调用MediaRecorder对象的start()方法开始录制。下面的Demo程序使用了MediaRecorder来录制声音。
- layout/activity_main.xml界面布局代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="horizontal">
<ImageButton
android:id="@+id/record"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/record" />
<ImageButton
android:id="@+id/stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/stop" />
</LinearLayout>
- MainActivity.java逻辑代码如下:
package com.fukaimei.recordsound;
import android.media.MediaRecorder;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
import android.widget.Toast;
import java.io.File;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
// 定义界面的两个按钮
ImageButton record, stop;
// 系统的音频文件
File soundFile;
MediaRecorder mRecorder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获取程序界面中的两个按钮
record = (ImageButton) findViewById(R.id.record);
stop = (ImageButton) findViewById(R.id.stop);
// 为两个按钮的单击事件绑定监听器
record.setOnClickListener(this);
stop.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// 单击录音按钮
if (v.getId() == R.id.record) {
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
Toast.makeText(this, "SD卡不存在,请插入SD卡!", Toast.LENGTH_SHORT).show();
return;
}
try {
// 创建保存录音的音频文件
soundFile = new File(Environment.getExternalStorageDirectory()
.getCanonicalFile() + "/sound.mp3");
mRecorder = new MediaRecorder();
// 设置录音的声音来源
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
// 设置录制的声音的输出格式(必须在设置声音编码格式之前设置)
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
// 设置声音编码格式
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setOutputFile(soundFile.getAbsolutePath());
mRecorder.prepare();
// 开始录音
mRecorder.start();
} catch (Exception e) {
e.printStackTrace();
}
} else if (v.getId() == R.id.stop) { // 单击停止按钮
if (soundFile != null && soundFile.exists()) {
// 停止录音
mRecorder.stop();
// 释放资源
mRecorder.release();
mRecorder = null;
}
}
}
@Override
protected void onDestroy() {
if (soundFile != null && soundFile.exists()) {
// 停止录音
mRecorder.stop();
// 释放资源
mRecorder.release();
mRecorder = null;
}
super.onDestroy();
}
}
上面的Demo程序中代码用于设置声音的相关参数,比如输出文件格式、声音的开源等等。
- 注意:由于该程序需要使用系统的麦克风进行录音,因此还需要在清单文件AndroidManifest.xml文件中授权相应的权限:
<!-- 授予该程序录制声音的权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- 授予该程序向外部存储器写入数据的权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- Demo程序运行效果界面截图如下: