手机
当前位置:查字典教程网 >编程开发 >Java >类似微信说话功能的录音处理代码分享
类似微信说话功能的录音处理代码分享
摘要:复制代码代码如下:packagecom.example.testaudio;importjava.io.File;importandroid...

复制代码 代码如下:

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运行windows的cmd命令简单代码

javamail 发送邮件的实例代码分享

java读取文件内容的三种方法代码片断分享(java文件操作)

简单的java读取文件示例分享

Java 图片压缩实现思路及代码

用java实现的获取优酷等视频缩略图的实现代码

日历显示读出输入的年月的java代码

java 获取数据库连接的实现代码

精品推荐
分类导航