Android多媒体学习九:利用MediaRecorder类实现自己的音频录制程序

上一篇中,我们在代码中有

  
  
  
  
  1. case R.id.btn2:  
  2.     //通过MediaRecorder类来实现自己的音频录制程序  
  3.     Intent intent2 = new Intent();  
  4.     intent2.setClass(this, MyAudioRecord.class);  
  5.     startActivityForResult(intent2, 1);  
  6.     break

这是启动我们自己定义的音频录制程序来完成录制工作。

代码如下:

  
  
  
  
  1. package demo.camera;  
  2. import java.io.File;  
  3. import java.io.IOException;  
  4. import android.app.Activity;  
  5. import android.content.ContentValues;  
  6. import android.content.Intent;  
  7. import android.media.MediaPlayer;  
  8. import android.media.MediaRecorder;  
  9. import android.net.Uri;  
  10. import android.os.Bundle;  
  11. import android.os.Environment;  
  12. import android.provider.MediaStore;  
  13. import android.view.View;  
  14. import android.widget.Button;  
  15. import android.widget.TextView;  
  16. /**  
  17.  * 这个是利用MediaRecorder类来实现自己的音频录制程序  
  18.  *   
  19.  * 为了可以录制音频我们需要RECORD_AUDIO权限  
  20.  * 为了可以写入SDCard,我们需要WRITE_EXTERNAL_STORAGE权限  
  21.  * @author Administrator  
  22.  *  
  23.  */ 
  24. public class MyAudioRecord extends Activity {  
  25.       
  26.     private TextView stateView;  
  27.       
  28.     private Button btnStart,btnStop,btnPlay,btnFinish;  
  29.       
  30.     private MediaRecorder recorder;  
  31.       
  32.     private MediaPlayer player;  
  33.       
  34.     private File audioFile;  
  35.       
  36.     private Uri fileUri;  
  37.       
  38.     public void onCreate(Bundle savedInstanceState){  
  39.         super.onCreate(savedInstanceState);  
  40.         setContentView(R.layout.my_audio_record);  
  41.           
  42.         stateView = (TextView)this.findViewById(R.id.view_state);  
  43.         stateView.setText("准备开始");  
  44.         btnStart = (Button)this.findViewById(R.id.btn_start);  
  45.         btnStop = (Button)this.findViewById(R.id.btn_stop);  
  46.         btnPlay = (Button)this.findViewById(R.id.btn_play);  
  47.         btnFinish = (Button)this.findViewById(R.id.btn_finish);  
  48.           
  49.         btnStop.setEnabled(false);  
  50.         btnPlay.setEnabled(false);  
  51.           
  52.     }  
  53.       
  54.       
  55.     public void onClick(View v){  
  56.         int id = v.getId();  
  57.         switch(id){  
  58.         case R.id.btn_start:  
  59.             //开始录制  
  60.             //我们需要实例化一个MediaRecorder对象,然后进行相应的设置  
  61.             recorder = new MediaRecorder();  
  62.             //指定AudioSource 为MIC(Microphone audio source ),这是最长用的  
  63.             recorder.setAudioSource(MediaRecorder.AudioSource.MIC);  
  64.             //指定OutputFormat,我们选择3gp格式  
  65.             //其他格式,MPEG-4:这将指定录制的文件为mpeg-4格式,可以保护Audio和Video  
  66.             //RAW_AMR:录制原始文件,这只支持音频录制,同时要求音频编码为AMR_NB  
  67.             //THREE_GPP:录制后文件是一个3gp文件,支持音频和视频录制  
  68.             recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);  
  69.             //指定Audio编码方式,目前只有AMR_NB格式  
  70.             recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);  
  71.             //接下来我们需要指定录制后文件的存储路径  
  72.             File fpath = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/data/files/");  
  73.             fpath.mkdirs();//创建文件夹  
  74.             try {  
  75.                 //创建临时文件  
  76.                 audioFile = File.createTempFile("recording"".3gp", fpath);  
  77.             } catch (IOException e) {  
  78.                 // TODO Auto-generated catch block  
  79.                 e.printStackTrace();  
  80.             }  
  81.               
  82.             recorder.setOutputFile(audioFile.getAbsolutePath());  
  83.               
  84.             //下面就开始录制了  
  85.             try {  
  86.                 recorder.prepare();  
  87.             } catch (IllegalStateException e) {  
  88.                 // TODO Auto-generated catch block  
  89.                 e.printStackTrace();  
  90.             } catch (IOException e) {  
  91.                 // TODO Auto-generated catch block  
  92.                 e.printStackTrace();  
  93.             }  
  94.               
  95.             recorder.start();  
  96.               
  97.             stateView.setText("正在录制");  
  98.             btnStart.setEnabled(false);  
  99.             btnPlay.setEnabled(false);  
  100.             btnStop.setEnabled(true);  
  101.               
  102.             break;  
  103.         case R.id.btn_stop:  
  104.             recorder.stop();  
  105.             recorder.release();  
  106.               
  107.             //然后我们可以将我们的录制文件存储到MediaStore中  
  108.             ContentValues values = new ContentValues();  
  109.             values.put(MediaStore.Audio.Media.TITLE, "this is my first record-audio");  
  110.             values.put(MediaStore.Audio.Media.DATE_ADDED, System.currentTimeMillis());  
  111.             values.put(MediaStore.Audio.Media.DATA, audioFile.getAbsolutePath());  
  112.             fileUri = this.getContentResolver().insert(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, values);  
  113.             //录制结束后,我们实例化一个MediaPlayer对象,然后准备播放  
  114.             player = new MediaPlayer();  
  115.             player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {  
  116.                   
  117.                 @Override 
  118.                 public void onCompletion(MediaPlayer arg0) {  
  119.                     //更新状态  
  120.                     stateView.setText("准备录制");  
  121.                     btnPlay.setEnabled(true);  
  122.                     btnStart.setEnabled(true);  
  123.                     btnStop.setEnabled(false);  
  124.                 }  
  125.             });  
  126.               
  127.             //准备播放  
  128.             try {  
  129.                 player.setDataSource(audioFile.getAbsolutePath());  
  130.                 player.prepare();  
  131.             } catch (IllegalArgumentException e) {  
  132.                 // TODO Auto-generated catch block  
  133.                 e.printStackTrace();  
  134.             } catch (IllegalStateException e) {  
  135.                 // TODO Auto-generated catch block  
  136.                 e.printStackTrace();  
  137.             } catch (IOException e) {  
  138.                 // TODO Auto-generated catch block  
  139.                 e.printStackTrace();  
  140.             }  
  141.               
  142.             //更新状态  
  143.             stateView.setText("准备播放");  
  144.             btnPlay.setEnabled(true);  
  145.             btnStart.setEnabled(true);  
  146.             btnStop.setEnabled(false);  
  147.             break;  
  148.         case R.id.btn_play:  
  149.             //播放录音  
  150.             //注意,我们在录音结束的时候,已经实例化了MediaPlayer,做好了播放的准备  
  151.             player.start();  
  152.             //更新状态  
  153.             stateView.setText("正在播放");  
  154.             btnStart.setEnabled(false);  
  155.             btnStop.setEnabled(false);  
  156.             btnPlay.setEnabled(false);  
  157.               
  158.             //在播放结束的时候也要更新状态  
  159.             break;  
  160.         case R.id.btn_finish:  
  161.             //完成录制,返回录制的音频的Uri  
  162.             Intent intent = new Intent();  
  163.             intent.setData(fileUri);  
  164.             this.setResult(RESULT_OK, intent);  
  165.             this.finish();  
  166.             break;            
  167.         }  
  168.     }  
  169. }  

 

你可能感兴趣的:(android,程序,录制)