類似微信說(shuō)話功能的錄音處理代碼分享
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);
}
}
//定時(shí)器
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() {
//判斷是否超時(shí)
if(starttime > 0 && System.currentTimeMillis() - starttime > maxtime) {
Log.e("testactivity", "超時(shí)的錄音時(shí)間,直接停止");
stopRecording();
return;
}
//更新分貝狀態(tài)
updateMicStatus();
}
};
/**
* 更新話筒狀態(tài) 分貝是也就是相對(duì)響度 分貝的計(jì)算公式K=20lg(Vo/Vi) Vo當(dāng)前振幅值 Vi基準(zhǔn)值為600:我是怎么制定基準(zhǔn)值的呢? 當(dāng)20
* * Math.log10(mMediaRecorder.getMaxAmplitude() / Vi)==0的時(shí)候vi就是我所需要的基準(zhǔn)值
* 當(dāng)我不對(duì)著麥克風(fēng)說(shuō)任何話的時(shí)候,測(cè)試獲得的mMediaRecorder.getMaxAmplitude()值即為基準(zhǔn)值。
* Log.i("mic_", "麥克風(fēng)的基準(zhǔn)值:" + mMediaRecorder.getMaxAmplitude());前提時(shí)不對(duì)麥克風(fēng)說(shuō)任何話
*/
private int BASE = 600;
private int SPACE = 300;// 間隔取樣時(shí)間
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_",
* "麥克風(fēng)的音量的大?。? + vuSize); } else Log.i("mic_", "麥克風(fēng)的音量的大小:" + 0);
*/
}
}
private void _handleRecordStart() {
//開始錄音的接收函數(shù)
tv.setText("開始錄音...");
//starttime 開始時(shí)間
}
private void _handleRecordStartError(Exception e) {
//開始錄音的接收函數(shù)失敗
tv.setText("開始錄音失敗:" + e.getMessage());
}
private void _handleRecordComplete() {
//結(jié)束錄音
tv.setText("停止錄音:" + theMediaPath);
}
private void _handleRecordVoice(int _db) {
//聲音事件偵聽,轉(zhuǎn)換成分貝
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;
}
}
相關(guān)文章
Java中二叉樹的先序、中序、后序遍歷以及代碼實(shí)現(xiàn)
這篇文章主要介紹了Java中二叉樹的先序、中序、后序遍歷以及代碼實(shí)現(xiàn),一棵二叉樹是結(jié)點(diǎn)的一個(gè)有限集合,該集合或者為空,或者是由一個(gè)根節(jié)點(diǎn)加上兩棵別稱為左子樹和右子樹的二叉樹組成,需要的朋友可以參考下2023-11-11Java統(tǒng)計(jì)輸入字符的英文字母、空格、數(shù)字和其它
這篇文章主要介紹了Java統(tǒng)計(jì)輸入字符的英文字母、空格、數(shù)字和其它,需要的朋友可以參考下2017-02-02Java的Flowable工作流之加簽轉(zhuǎn)簽詳解
這篇文章主要介紹了Java的Flowable工作流之加簽轉(zhuǎn)簽詳解,Flowable是一個(gè)開源的工作流引擎,它提供了一套強(qiáng)大的工具和功能,用于設(shè)計(jì)、執(zhí)行和管理各種類型的工作流程,需要的朋友可以參考下2023-11-11Java中如何使用Gson將對(duì)象轉(zhuǎn)換為JSON字符串
這篇文章主要給大家介紹了關(guān)于Java中如何使用Gson將對(duì)象轉(zhuǎn)換為JSON字符串的相關(guān)資料,Gson是Google的一個(gè)開源項(xiàng)目,可以將Java對(duì)象轉(zhuǎn)換成JSON,也可能將JSON轉(zhuǎn)換成Java對(duì)象,需要的朋友可以參考下2023-11-11Spring mvc攔截器實(shí)現(xiàn)原理解析
這篇文章主要介紹了Spring mvc攔截器實(shí)現(xiàn)原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03