android使用MediaRecorder实现录音

有四个按钮,分别是“录音”、“停止”、“播放”、“删除”。如图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项

  1. public class ActivityMain extends Activity {  
  2.     private ImageButton iRecordButton;  
  3.     private ImageButton iStopButton;  
  4.     private ImageButton iPlayButton;  
  5.     private ImageButton iDeleteButton;  
  6.     private ListView iListView;  
  7.     private String iTempFileNameString = "iRecorder_";  
  8.     private File iRecAudioFile;  
  9.     private File iRecAudioDir;  
  10.     private File iPlayFile;  
  11.     private MediaRecorder iMediaRecorder;  
  12.   
  13.     private ArrayList<String> iRecordFiles;  
  14.     private ArrayAdapter<String> iAdapter;  
  15.     private TextView iTextView;  
  16.     private boolean isSDCardExit;  
  17.     private boolean isStopRecord;  
  18.   
  19.     /** Called when the activity is first created. */  
  20.     @Override  
  21.     public void onCreate(Bundle savedInstanceState) {  
  22.         super.onCreate(savedInstanceState);  
  23.         setContentView(R.layout.main);  
  24.   
  25.         iRecordButton = (ImageButton) findViewById(R.id.ImageButton01);  
  26.         iStopButton = (ImageButton) findViewById(R.id.ImageButton02);  
  27.         iPlayButton = (ImageButton) findViewById(R.id.ImageButton03);  
  28.         iDeleteButton = (ImageButton) findViewById(R.id.ImageButton04);  
  29.         iListView = (ListView) findViewById(R.id.ListView01);  
  30.         iTextView = (TextView) findViewById(R.id.TextView01);  
  31.         /* 初始后三个按钮不可用 */  
  32.         iStopButton.setEnabled(false);  
  33.         iPlayButton.setEnabled(false);  
  34.         iDeleteButton.setEnabled(false);  


    

    
需要判断SD卡是否是插入状态,以保证我们可以长时间的进行录音。如果存在则取得SD卡路径作为录音的文件位置。然后取得SD卡中的.amr文件。getRecordFiles()是一个自定义的方法,后面将会有说明。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值