录音器开发实例

录音器实例

本节通过一个简单的录音程序演示一下MediaRecorder的用法。运行项目chapter7_4,如图7-7所示。录音器包含录制、停止和播放3个按钮,并在按钮的下方提供了一个计时器,记录录音的时间。

 
图7-7  录音器运行界面
当用户点击"录音"按钮后,创建一个MediaRecorder对象并配置数据源的数据,这里数据源来自麦克风,存储文件格式是3gpp,后缀名为.3ga,音频内容编码是AMR NB。每次录音,系统都是临时指定一个输出路径。RecorderActivity代码如下所示,由于录音与多媒体播放的API相似,请参考源代码注释,这里不再一一讲解。
 
 
  1. package com.ophone.chapter7_4;  
  2.  
  3. import java.io.IOException;  
  4.  
  5. import android.app.Activity;  
  6. import android.media.MediaPlayer;  
  7. import android.media.MediaRecorder;  
  8. import android.os.Bundle;  
  9. import android.os.Handler;  
  10. import android.os.Message;  
  11. import android.view.View;  
  12. import android.widget.ImageButton;  
  13. import android.widget.TextView;  
  14.  
  15. public class RecorderActivity extends Activity {  
  16.  
  17.     public static final int UPDATE = 0;  
  18.     private ImageButton play;  
  19.     private ImageButton stop;  
  20.     private ImageButton record;  
  21.     private TextView time;  
  22.     private MediaRecorder recorder;  
  23.     private MediaPlayer player;  
  24.     private String path = "";  
  25.     private int duration = 0;  
  26.     private int state = 0;  
  27.     private static final int IDLE = 0;  
  28.     private static final int RECORDING = 1;  
  29.  
  30.     private Handler handler = new Handler() {  
  31.  
  32.         @Override  
  33.         public void handleMessage(Message msg) {  
  34.             if (state == RECORDING) {  
  35.                 super.handleMessage(msg);  
  36.                 duration++;  
  37.                 time.setText(timeToString());  
  38.                 //循环更新录音器的界面  
  39.                 handler.sendMessageDelayed(handler.
    obtainMessage(UPDATE), 1000);  
  40.             }  
  41.         }  
  42.  
  43.     };  
  44.  
  45.     @Override  
  46.     public void onCreate(Bundle savedInstanceState) {  
  47.         super.onCreate(savedInstanceState);  
  48.         setContentView(R.layout.main);  
  49.         //初始化"播放"按钮  
  50.         play = (ImageButton) findViewById(R.id.play);  
  51.         play.setOnClickListener(new View.OnClickListener() {  
  52.             public void onClick(View arg0) {  
  53.                 play();  
  54.             }  
  55.         });  
  56.         //初始化"停止"按钮  
  57.         stop = (ImageButton) findViewById(R.id.stop);  
  58.         stop.setOnClickListener(new View.OnClickListener() {  
  59.             public void onClick(View arg0) {  
  60.                 stop();  
  61.             }  
  62.         });  
  63.         //初始化"录音"按钮  
  64.         record = (ImageButton) findViewById(R.id.record);  
  65.         record.setOnClickListener(new View.OnClickListener() {  
  66.             public void onClick(View arg0) {  
  67.                 record();  
  68.             }  
  69.         });  
  70.         time = (TextView) findViewById(R.id.time);  
  71.     }  
  72.  
  73.     //播放刚刚录制的音频文件  
  74.     private void play() {  
  75.         if ("".equals(path) || state == RECORDING)  
  76.             return;  
  77.         if (player == null)  
  78.             player = new MediaPlayer();  
  79.         else  
  80.             player.reset();  
  81.         try {  
  82.             player.setDataSource(path);  
  83.             player.prepare();  
  84.             player.start();  
  85.         } catch (IllegalArgumentException e) {  
  86.             e.printStackTrace();  
  87.         } catch (IllegalStateException e) {  
  88.             e.printStackTrace();  
  89.         } catch (IOException e) {  
  90.             e.printStackTrace();  
  91.         }  
  92.     }  
  93.  
  94.     private void record() {  
  95.         try {  
  96.             if (recorder == null)  
  97.                 recorder = new MediaRecorder();  
  98.             //设置输入为麦克风  
  99.             recorder.setAudioSource(MediaRecorder.AudioSource.MIC);  
  100.             //设置输出的格式为3gp文件  
  101.             recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);  
  102.             //音频的编码采用AMR  
  103.             recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);  
  104.             //临时的文件存储路径  
  105.             path = "/sdcard/" + System.currentTimeMillis() + ".3ga";  
  106.             recorder.setOutputFile(path);  
  107.             recorder.prepare();  
  108.             recorder.start();  
  109.             state = RECORDING;  
  110.             handler.sendEmptyMessage(UPDATE);  
  111.         } catch (IllegalStateException e) {  
  112.             e.printStackTrace();  
  113.         } catch (IOException e) {  
  114.             e.printStackTrace();  
  115.         }  
  116.     }  
  117.  
  118.     private void stop() {  
  119.         // 停止录音,释放recorder对象  
  120.         if (recorder != null) {  
  121.                  recorder.stop();  
  122.                  recorder.release();  
  123.         }  
  124.         recorder = null;  
  125.         handler.removeMessages(UPDATE);  
  126.         state = IDLE;  
  127.         duration = 0;  
  128.     }  
  129.  
  130.     @Override  
  131.     protected void onDestroy() {  
  132.         super.onDestroy();  
  133.         //Activity销毁后,释放播放器和录音器资源  
  134.         if (recorder != null) {  
  135.             recorder.release();  
  136.             recorder = null;  
  137.         }  
  138.         if (player != null) {  
  139.             player.release();  
  140.             player = null;  
  141.         }  
  142.     }  
  143.  
  144.     private String timeToString() {  
  145.         if (duration >= 60) {  
  146.             int min = duration / 60;  
  147.             String m = min > 9 ? min + "" : "0" + min;  
  148.             int sec = duration % 60;  
  149.             String s = sec > 9 ? sec + "" : "0" + sec;  
  150.             return m + ":" + s;  
  151.         } else {  
  152.             return "00:" + (duration > 9 ? duration + "" : "0" + duration);  
  153.         }  
  154.     }  
本文转载自:http://book.51cto.com/art/200912/173826.htm,转载请注明出处

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值