有四个按钮,分别是“录音”、“停止”、“播放”、“删除”。如图1所示。
图1:录音机的界面
MediaRecorder的生命周期
- MediaRecorder可以用来录制音频或视频。它具有以下几个状态:
- Initial:初始状态,在设定视频源或者音频源之后将转换为Initialized状态。
- Initialized:已初始化状态,可以通过设置输出格式转换为DataSourceConfigured状态,或者通过重新启动转换成Initial状态。
- DataSourceConfigured:数据源配置状态,这期间可以设定编码方式、输出文件、屏幕旋转、预览显示等等。它仍然可以通过从新启动回到Initial状态,或者通过就绪到达Prepared状态。
- Prepared:就绪状态,在就绪状态仍然可以通过重新启动方法回到Initialized状态。或者通过start方法进入录制状态。
- Recording:录制状态,真正在录音的那个状态,前边做的一切都是铺垫,它可以通过停止或者重新启动回到Initial状态。
- Released:释放状态(官方文档给出的词叫做 Idle state 空闲状态,而官方的图却不这么写),Initial状态可以通过调用释放方法来进入这个状态,这时将会释放所有和MediaRecorder对象绑定的资源。
- Error:错误状态,当错误发生的时候进入这个状态,它可以通过从新启动进入Initial状态。
其生命周期状态转换关系如图2所示。
图2:MediaRecorder的生命周期
MediaRecorder如何使用
通常使用MediaRecorder进行声音录制需要遵从以下几个步骤:
实例化MediaRecorder类对象:
MediaRecorder iMediaRecorder= new MediaRecorder();
- 设置录音来源 :
iMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
- 设置输出格式:
iMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
- 设置编码方式
iMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
- 设置输出文件
iMediaRecorder.setOutputFile(PATH_NAME);
- 让MediaRecorder对象处于就绪状态
iMediaRecorder.prepare();
- 开始录音
iMediaRecorder.start();
- 停止录音,一旦停止则必须从新配置MediaRecorder对象才能再次开始录音。
iMediaRecorder.stop();
- 从新启动MediaRecorder对象让它处于空闲状态。
iMediaRecorder.reset();
- 释放和MediaRecorder对向相关的所有资源。
iMediaRecorder.release();
程序如何实现
OPhone华丽的界面,灵活的界面组合方式给我们开发者带来了极大的便利。
首先来看看我们这个类的成员变量和初始化方法。成员变量一共包含四个ImageButton用来和用户进行交互,之所以用ImageButton是因为它可以把图片显示在按钮上,让程序看起来更加美观。一个ListView用来显示已经录制好的声音片段供用户选择。一个TextView用来告知用户当前程序状态。程序运行之初,将录音按钮以外的按钮设定成不可用状态。
package com.ophone.iRecorder;
//这里为了节省篇幅,忽略了import项
- public class ActivityMain extends Activity {
- private ImageButton iRecordButton;
- private ImageButton iStopButton;
- private ImageButton iPlayButton;
- private ImageButton iDeleteButton;
- private ListView iListView;
- private String iTempFileNameString = "iRecorder_";
- private File iRecAudioFile;
- private File iRecAudioDir;
- private File iPlayFile;
- private MediaRecorder iMediaRecorder;
- private ArrayList<String> iRecordFiles;
- private ArrayAdapter<String> iAdapter;
- private TextView iTextView;
- private boolean isSDCardExit;
- private boolean isStopRecord;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- iRecordButton = (ImageButton) findViewById(R.id.ImageButton01);
- iStopButton = (ImageButton) findViewById(R.id.ImageButton02);
- iPlayButton = (ImageButton) findViewById(R.id.ImageButton03);
- iDeleteButton = (ImageButton) findViewById(R.id.ImageButton04);
- iListView = (ListView) findViewById(R.id.ListView01);
- iTextView = (TextView) findViewById(R.id.TextView01);
- /* 初始后三个按钮不可用 */
- iStopButton.setEnabled(false);
- iPlayButton.setEnabled(false);
- iDeleteButton.setEnabled(false);