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

 更新时间:2014年01月19日 14:19:42   作者:  
这篇文章主要介绍了类似微信中说话功能的录音处理代码,需要大家自己加UI界面,大家参考使用吧

复制代码 代码如下:

package com.example.testaudio;

import java.io.File;

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

public class MainActivity extends Activity {

 private MediaRecorder recoder = null;
 private MediaPlayer player = null;
 private String theMediaPath;

 TextView tv = null;
 TextView tvRecord = null;
 Button testBtn = null;
 Button testBtn2 = null;
 Button stopBtn = null;
 Button playBtn = null;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  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(new OnTouchListener() {
   @Override
   public boolean onTouch(View v, MotionEvent event) {
    Log.i("testactivity", "setOnTouchListener:"+event.getAction());
    switch(event.getAction()) {
     case MotionEvent.ACTION_UP: {
      Log.i("testactivity", "停止录音");
      stopRecording();
      break;
     }
     case MotionEvent.ACTION_DOWN: {
      Log.i("testactivity", "开始录音");
      startRecording();
      break;
     }
     default: break;
    }
    return false;
   }
  });

  
  testBtn.setOnClickListener(new OnClickListener() {
   public void onClick(View arg0) {
    startRecording();
    testBtn.setEnabled(false);
    stopBtn.setEnabled(true);
   }
  });

  stopBtn.setEnabled(false);

  stopBtn.setOnClickListener(new OnClickListener() {
   public void onClick(View arg0) {
    stopRecording();
    testBtn.setEnabled(true);
    playBtn.setEnabled(true);
    stopBtn.setEnabled(false);
   }
  });

  
  playBtn.setOnClickListener(new OnClickListener() {
   public void onClick(View arg0) {
    playRecordFile(theMediaPath);
    stopBtn.setEnabled(true);
   }
  });
 }

 protected void playRecordFile(String _file) {
  try {
   File f = new File(_file);
   if(!f.exists()) {
    tv.setText("文件不存在:" + _file);
    return;
   }
  } catch(Exception e) {
   Log.i("testactivity", e.getMessage());
  }
  try {
   player = new MediaPlayer();
   player.setDataSource(_file);
   player.prepare();
   player.setOnCompletionListener(new OnCompletionListener() {
    public void onCompletion(MediaPlayer arg0) {
     tv.setText("播放完毕");
     stopBtn.setEnabled(false);
    }
   });

   player.start();
  } catch(Exception e) {
   Log.e("testactivity", "play failed:" + e.getMessage());
  }
 }

 /**
  * 停止录音处理
  */
 protected void stopRecording() {

  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;
  }
 }

 
 /**
  * 开始录音处理
  */
 protected void startRecording() {

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

  recoder = new MediaRecorder();
  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 (Exception e) {
   Log.e("testactivity", "prepared failed:" + e.getMessage());
   _handleRecordStartError(e);
  }

 }

 //定时器
 private static long maxtime = 30*1000; //30秒
 private long starttime = 0l;
 private long endtime = 0l;
 private final Handler mHandler = new Handler(); 
    private Runnable mUpdateMicStatusTimer = new Runnable() { 
        public void run() { 
         //判断是否超时
         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());前提时不对麦克风说任何话
     */ 
    private int BASE = 600; 
    private int SPACE = 300;// 间隔取样时间

    private void updateMicStatus() { 
        if (recoder != null) { 
            // int vuSize = 10 * mMediaRecorder.getMaxAmplitude() / 32768; 
            int ratio = recoder.getMaxAmplitude() / BASE; 
            int db = 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); } else Log.i("mic_", "麦克风的音量的大小:" + 0);
             */ 
        } 
    }
 

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

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

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

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

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
 }

}

相关文章

  • Java中二叉树的先序、中序、后序遍历以及代码实现

    Java中二叉树的先序、中序、后序遍历以及代码实现

    这篇文章主要介绍了Java中二叉树的先序、中序、后序遍历以及代码实现,一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成,需要的朋友可以参考下
    2023-11-11
  • JAVA反射机制实例教程

    JAVA反射机制实例教程

    这篇文章主要介绍了JAVA反射机制,包括了Java反射机制的各种应用技巧,非常具有实用价值,需要的朋友可以参考下
    2014-09-09
  • 详解Spring Retry实现原理

    详解Spring Retry实现原理

    这篇文章主要介绍了详解Spring Retry实现原理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • spring循环注入异常问题的解决方案

    spring循环注入异常问题的解决方案

    今天小编就为大家分享一篇关于spring循环注入异常问题的解决方案,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • Java统计输入字符的英文字母、空格、数字和其它

    Java统计输入字符的英文字母、空格、数字和其它

    这篇文章主要介绍了Java统计输入字符的英文字母、空格、数字和其它,需要的朋友可以参考下
    2017-02-02
  • Java的Flowable工作流之加签转签详解

    Java的Flowable工作流之加签转签详解

    这篇文章主要介绍了Java的Flowable工作流之加签转签详解,Flowable是一个开源的工作流引擎,它提供了一套强大的工具和功能,用于设计、执行和管理各种类型的工作流程,需要的朋友可以参考下
    2023-11-11
  • Springboot @Value获取值为空问题解决方案

    Springboot @Value获取值为空问题解决方案

    这篇文章主要介绍了Springboot @Value获取值为空问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Java中如何使用Gson将对象转换为JSON字符串

    Java中如何使用Gson将对象转换为JSON字符串

    这篇文章主要给大家介绍了关于Java中如何使用Gson将对象转换为JSON字符串的相关资料,Gson是Google的一个开源项目,可以将Java对象转换成JSON,也可能将JSON转换成Java对象,需要的朋友可以参考下
    2023-11-11
  • Spring mvc拦截器实现原理解析

    Spring mvc拦截器实现原理解析

    这篇文章主要介绍了Spring mvc拦截器实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Springboot项目使用拦截器方法详解

    Springboot项目使用拦截器方法详解

    这篇文章主要介绍了Springboot项目使用拦截器方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09

最新评论