zl程序教程

您现在的位置是:首页 >  工具

当前栏目

类似微信说话功能的录音处理代码分享

微信代码 处理 功能 分享 类似 说话 录音
2023-06-13 09:15:16 时间

复制代码代码如下:


packagecom.example.testaudio;

importjava.io.File;

importandroid.app.Activity;
importandroid.media.MediaPlayer;
importandroid.media.MediaPlayer.OnCompletionListener;
importandroid.media.MediaRecorder;
importandroid.os.Bundle;
importandroid.os.Environment;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.util.Log;
importandroid.view.Menu;
importandroid.view.MotionEvent;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.view.View.OnTouchListener;
importandroid.widget.Button;
importandroid.widget.TextView;

publicclassMainActivityextendsActivity{

 privateMediaRecorderrecoder=null;
 privateMediaPlayerplayer=null;
 privateStringtheMediaPath;

 TextViewtv=null;
 TextViewtvRecord=null;
 ButtontestBtn=null;
 ButtontestBtn2=null;
 ButtonstopBtn=null;
 ButtonplayBtn=null;

 @Override
 protectedvoidonCreate(BundlesavedInstanceState){
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  tv=(TextView)findViewById(R.id.textView1);
  tvRecord=(TextView)findViewById(R.id.tvRecord);
  testBtn=(Button)findViewById(R.id.button1);
  testBtn2=(Button)findViewById(R.id.button2);
  stopBtn=(Button)findViewById(R.id.buttonStop);
  playBtn=(Button)findViewById(R.id.buttonPlay);

  testBtn2.setOnTouchListener(newOnTouchListener(){
   @Override
   publicbooleanonTouch(Viewv,MotionEventevent){
    Log.i("testactivity","setOnTouchListener:"+event.getAction());
    switch(event.getAction()){
     caseMotionEvent.ACTION_UP:{
      Log.i("testactivity","停止录音");
      stopRecording();
      break;
     }
     caseMotionEvent.ACTION_DOWN:{
      Log.i("testactivity","开始录音");
      startRecording();
      break;
     }
     default:break;
    }
    returnfalse;
   }
  });

  
  testBtn.setOnClickListener(newOnClickListener(){
   publicvoidonClick(Viewarg0){
    startRecording();
    testBtn.setEnabled(false);
    stopBtn.setEnabled(true);
   }
  });

  stopBtn.setEnabled(false);

  stopBtn.setOnClickListener(newOnClickListener(){
   publicvoidonClick(Viewarg0){
    stopRecording();
    testBtn.setEnabled(true);
    playBtn.setEnabled(true);
    stopBtn.setEnabled(false);
   }
  });

  
  playBtn.setOnClickListener(newOnClickListener(){
   publicvoidonClick(Viewarg0){
    playRecordFile(theMediaPath);
    stopBtn.setEnabled(true);
   }
  });
 }

 protectedvoidplayRecordFile(String_file){
  try{
   Filef=newFile(_file);
   if(!f.exists()){
    tv.setText("文件不存在:"+_file);
    return;
   }
  }catch(Exceptione){
   Log.i("testactivity",e.getMessage());
  }
  try{
   player=newMediaPlayer();
   player.setDataSource(_file);
   player.prepare();
   player.setOnCompletionListener(newOnCompletionListener(){
    publicvoidonCompletion(MediaPlayerarg0){
     tv.setText("播放完毕");
     stopBtn.setEnabled(false);
    }
   });

   player.start();
  }catch(Exceptione){
   Log.e("testactivity","playfailed:"+e.getMessage());
  }
 }

 /**
 *停止录音处理
 */
 protectedvoidstopRecording(){

  if(recoder!=null){
   Log.i("testactivity","停止录音");
   recoder.stop();
   recoder.release();
   recoder=null;
   endtime=System.currentTimeMillis();
   _handleRecordComplete();
  }
  if(player!=null){
   Log.i("testactivity","停止播放");
   player.stop();
   player.release();
   player=null;
  }
 }

 
 /**
 *开始录音处理
 */
 protectedvoidstartRecording(){

  theMediaPath=Environment.getExternalStorageDirectory().getAbsolutePath();
  theMediaPath+="/audiotest.3gp";

  recoder=newMediaRecorder();
  recoder.setAudioSource(MediaRecorder.AudioSource.MIC);
  recoder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
  recoder.setOutputFile(theMediaPath);
  recoder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

  starttime=System.currentTimeMillis();
  updateMicStatus();

  try{
   recoder.prepare();
   recoder.start();
   _handleRecordStart();
  }catch(Exceptione){
   Log.e("testactivity","preparedfailed:"+e.getMessage());
   _handleRecordStartError(e);
  }

 }

 //定时器
 privatestaticlongmaxtime=30*1000;//30秒
 privatelongstarttime=0l;
 privatelongendtime=0l;
 privatefinalHandlermHandler=newHandler(); 
   privateRunnablemUpdateMicStatusTimer=newRunnable(){ 
       publicvoidrun(){ 
        //判断是否超时
        if(starttime>0&&System.currentTimeMillis()-starttime>maxtime){
         Log.e("testactivity","超时的录音时间,直接停止");
         stopRecording();
         return;
        }

        //更新分贝状态
           updateMicStatus(); 
       } 
   }; 

   /**
    *更新话筒状态分贝是也就是相对响度分贝的计算公式K=20lg(Vo/Vi)Vo当前振幅值Vi基准值为600:我是怎么制定基准值的呢?当20
    **Math.log10(mMediaRecorder.getMaxAmplitude()/Vi)==0的时候vi就是我所需要的基准值
    *当我不对着麦克风说任何话的时候,测试获得的mMediaRecorder.getMaxAmplitude()值即为基准值。
    *Log.i("mic_","麦克风的基准值:"+mMediaRecorder.getMaxAmplitude());前提时不对麦克风说任何话
    */ 
   privateintBASE=600; 
   privateintSPACE=300;//间隔取样时间

   privatevoidupdateMicStatus(){ 
       if(recoder!=null){ 
           //intvuSize=10*mMediaRecorder.getMaxAmplitude()/32768; 
           intratio=recoder.getMaxAmplitude()/BASE; 
           intdb=0;//分贝 
           if(ratio>1) 
               db=(int)(20*Math.log10(ratio)); 

           
           _handleRecordVoice(db);

           mHandler.postDelayed(mUpdateMicStatusTimer,SPACE); 
           /*
            *if(db>1){vuSize=(int)(20*Math.log10(db));Log.i("mic_",
            *"麦克风的音量的大小:"+vuSize);}elseLog.i("mic_","麦克风的音量的大小:"+0);
            */ 
       } 
   }
 

 privatevoid_handleRecordStart(){
  //开始录音的接收函数
  tv.setText("开始录音...");
  //starttime开始时间
 }

 privatevoid_handleRecordStartError(Exceptione){
  //开始录音的接收函数失败
  tv.setText("开始录音失败:"+e.getMessage());
 }

 privatevoid_handleRecordComplete(){
  //结束录音
  tv.setText("停止录音:"+theMediaPath);
 }

 privatevoid_handleRecordVoice(int_db){
  //声音事件侦听,转换成分贝
  tvRecord.setText(""+_db);
 }

 @Override
 publicbooleanonCreateOptionsMenu(Menumenu){
  //Inflatethemenu;thisaddsitemstotheactionbarifitispresent.
  getMenuInflater().inflate(R.menu.main,menu);
  returntrue;
 }

}