本鉴于现在大部分的手机都提供了音频录制的功能,Android系统相应地提供了对音频及视频录制的支持,当然这也需要有硬件的支持。要想录制音频及视频需要通过MediaRecorder来完成。
MediaRecorder类位于android.media包中,它包含了音频及视频的记录功能。常用的方法如表1所示。
表1 MediaRecorder的常用方法
方法 |
描述 |
方法 |
描述 |
start() |
开始录制 |
prepare() |
准备录制 |
pause() |
暂停录制 |
reset() |
重新开始 |
stop() |
停止录制 |
release() |
释放资源 |
MediaRecorder类的工作流程如图1所示。

要实现音频及视频的录制的步骤说明如下所示。
在工程的res/drawable目录下放置两个图片文件,用来设置控制按钮的图片。
□ 在布局文件main.xml中添加3个View组件,其中TextView用来显示标题,其余两个按钮用来控制开始录制和停止录制。
□ 创建Activity类MainActivity。
□ 生成两个ImageButton实例。
□ 创建loadCip()方法,实例化MediaRecorder。
□ 在onCreate()方法中实例化。
□ 创建record()方法,调用MediaRecorder的start()方法录制,同时使录制按钮失效,使停止按钮生效。
□ 创建stop()方法,调用MediaRecorder的stop()方法停止录制。
□ 创建error()方法捕获异常。
□ 创建setProperty()方法,设置MediaRecorder的属性,包括用MediaRecorder.setAudio
Source()方法来设置音频源,你可以用MediaRecorder.AudioSource.MIC方法来设置麦克风;用MediaRecorder.setOutputFormat()方法来设置输出文件格式;用MediaRecorder.setAudioEncoder()方法来设置音频编码格式。
□ 创建setup()方法,调用loadClip(),使录制按钮生效,使停止按钮失效。
□ 为录制按钮添加单击事件,调用play()方法录制。
□ 为停止按钮添加单击事件,调用stop()方法停止录制。
□ 当实现的MediaRecorder类完成音频的捕捉后,调用release()方法。
布局文件main.xml的代码如代码清单1所示。
代码清单1 main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="//schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="迷你录音器"
/>
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageButton
android:id="@+id/record"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/record"
></ImageButton>
<ImageButton
android:id="@+id/stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/stop"
></ImageButton>
</LinearLayout>
</LinearLayout>
Activity代码如代码清单2所示。
代码清单2 MainActivity.java
package cn.com.farsight.record;
import java.io.File;
import java.io.IOException;
import com.examples.android.helloactivity.R;
import android.app.Activity;
import android.app.AlertDialog;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
public class MainActivity extends Activity {
//声明图片按钮ImageButton
private ImageButton record,stop;
//声明MediaRecorder
private MediaRecorder mr;
//声明路径
private String path;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置当前Activity界面布局
setContentView(R.layout.main);
//通过findViewById方法获得ImageButton实例
record = (ImageButton)findViewById(R.id.record);
stop = (ImageButton)findViewById(R.id.stop);
//为录制按钮设置单击事件监听器
record.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//录制
record();
}
});
//为停止按钮设置单击事件监听器
stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//停止录制
stop();
}
});
//准备
setup();
}
//设置路径
private void setPath() throws IOException{
//路径为sd扩展卡
path = "/sdcard/test.mp3";
//获得sd扩展卡状态
String state = android.os.Environment.getExternalStorageState();
//判断是否安装扩展卡
if(!state.equals(android.os.Environment.MEDIA_MOUNTED)){
throw new IOException("SD没有安装,它的状态是"+state+".");
}
//获取文件父目录
File directory = new File(path).getParentFile();
if(!directory.exists()&& !directory.mkdirs()){
throw new IOException("文件不能被创建. ");
}
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
if(stop.isEnabled()){
//停止录制
stop();
}
}
//录制方法
private void record(){
try{
//准备
mr.prepare();
}catch(IllegalStateException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
//开始录制
mr.start();
//使录制按钮失效
record.setEnabled(false);
//使停止按钮生效
stop.setEnabled(true);
}
//停止
private void stop(){
//停止录制
mr.stop();
//使停止按钮失效
stop.setEnabled(false);
//使录制按钮生效
record.setEnabled(true);
//释放资源
mr.release();
}
//设置属性
private void setProperty(){
try{
//实例化MediaRecorder
mr = new MediaRecorder();
//设置音频源
mr.setAudioSource(MediaRecorder.AudioSource.MIC);
//设置输出格式
mr.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
//设置音频编码器
mr.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
try{
//设置路径
setPath();
}catch(IOException e){
e.printStackTrace();
}
//设置输出文件
mr.setOutputFile(path);
}catch(Throwable t){
error(t);
}
}
//准备
private void setup(){
//设置属性
setPeoperty();
//使录制按钮生效
record.setEnabled(true);
//使停止按钮生效
stop.setEnabled(false);
}
//错误提示
private void error(Throwable t){
//对话框
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("报错啦!").setMessage(t.toString()).setPositiveButton("确定", null).show();
}
}