複製代碼代碼如下:
包com.example.testaudio;
導入java.io.file;
導入Android.App.Activity;
導入android.media.mediaplayer;
導入android.media.mediaplayer.oncompletionlistener;
導入android.media.mediarecorder;
導入android.os.bundle;
導入Android.os.Environment;
導入android.os.handler;
導入android.os.message;
導入android.util.log;
導入android.view.menu;
導入android.view.motionevent;
導入android.view.view;
導入android.view.view.onclicklistener;
導入android.view.view.ontouchlistener;
導入android.widget.button;
導入android.widget.textView;
公共班級主進擴展活動{
私有Mediarecorder recoder = null;
私人MediaPlayer Player = null;
私人主題主題;
textView tv = null;
textView tvrecord = null;
按鈕testbtn = null;
按鈕testbtn2 = null;
按鈕stopbtn = null;
按鈕playbtn = null;
@Override
受保護的void ongreate(捆綁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(視圖V,MotionEvent事件){
log.i(“ testAckitive”,“ setOntOntouchListener:”+event.getAction());
switch(event.getAction()){
case MotionEvent.Action_UP:{
log.i(“術語”,“停止錄音”);
stopRecording();
休息;
}
case MotionEvent.Action_Down:{
log.i(“術語”,“開始錄音”);
StarTrecording();
休息;
}
默認值:break;
}
返回false;
}
});
testbtn.setonClickListener(新的OnClickListener(){
public void onclick(查看arg0){
StarTrecording();
testbtn.setEnabled(false);
stopbtn.setEnabled(true);
}
});
stopbtn.setEnabled(false);
stopbtn.setonClickListener(新的OnClickListener(){
public void onclick(查看arg0){
stopRecording();
testbtn.setEnabled(true);
playbtn.setEnabled(true);
stopbtn.setEnabled(false);
}
});
playbtn.setonClickListener(new OnClickListener(){
public void onclick(查看arg0){
PlayRecordFile(主題);
stopbtn.setEnabled(true);
}
});
}
受保護的void playrecordfile(字符串_file){
嘗試 {
文件f =新文件(_file);
如果(!f.exists()){
tv.setText(“文件不存在:” + _file);
返回;
}
} catch(異常E){
log.i(“ testActivity”,e.getMessage());
}
嘗試 {
player = new MediaPlayer();
player.setDataSource(_file);
player.prepare();
player.setonCompletionListener(新的OnCompletionListener(){
公共無效oncompletion(MediaPlayer arg0){
tv.setText(“播放完畢”);
stopbtn.setEnabled(false);
}
});
player.start();
} catch(異常E){
log.e(“ testActivity”,“播放失敗:” + e.getMessage());
}
}
/**
*停止錄音處理
*/
受保護的void stopRecording(){
如果(recoder!= null){
log.i(“術語”,“停止錄音”);
recoder.stop();
recoder.Release();
recoder = null;
endtime = system.currentTimeMillis();
_handlerecordComplete();
}
如果(player!= null){
log.i(“術語”,“停止播放”);
player.stop();
player.Release();
player = null;
}
}
/**
*開始錄音處理
*/
受保護的void startrecording(){
themediapath = emovention.getExternalStorageDirectory()。getabsolutepath();
themediapath +=“/audiotest.3GP”;
recoder = new Mediarecorder();
recoder.setaudiosource(Mediarecorder.audiosource.mic);
recoder.setOutputFormat(Mediarecorder.outputformat.three_gpp);
recoder.setOutputfile(主題路徑);
recoder.setaudioencoder(Mediarecorder.audioencoder.amr_nb);
startTime = system.currentTimeMillis();
updatemicstatus();
嘗試 {
recoder.prepare();
recoder.start();
_handlerecordstart();
} catch(異常E){
log.e(“ testAccativity”,“準備的失敗:” + e.getMessage());
_handlerecordstarterror(e);
}
}
//定時器
私人靜態長axtime = 30*1000; // 30秒
私有長啟動時間= 0L;
私人長時間= 0L;
私人最終處理程序mhandler = new Handler();
私有可運行的mupdatemicStatustimer = new runnable(){
public void run(){
//判斷是否超時
if(starttime> 0 && system.currenttimemillis() - starttime> maxtime){
log.e(“術語”,“超時的錄音時間,直接停止”);
stopRecording();
返回;
}
//更新分貝狀態
updatemicstatus();
}
};
/**
*更新話筒狀態更新話筒狀態分貝的計算公式k = 20lg(vo/vi)vo當前振幅值vi vi基準值為600:我是怎麼制定基準值的呢?20
* * Math.log10(mmediarecorder.getmaxamplitude() / vi)== 0的時候vi就是我所需要的基準值
*當我不對著麥克風說任何話的時候,測試獲得的mmediarecorder.getmaxamplitude()值即為基準值。
* log.i(“ mic_”,“麥克風的基準值:” + mmediarecorder.getMaxAmplitude());前提時不對麥克風說任何話
*/
私有int base = 600;
私人int空間= 300; //間隔取樣時間
私有void updatemicTatus(){
如果(recoder!= null){
// int vusize = 10 * mmediarecorder.getMaxAmplitude() / 32768;
int比率= recoder.getMaxAmplitude() / base;
int db = 0; //分貝
如果(比率> 1)
db =(int)(20 * Math.log10(比率));
_handlerecordvoice(db);
mhandler.postdelayed(MupdatemicStatustimer,空間);
/*
* if(db> 1){vusize =(int)(20 * Math.log10(db)); log.i(“ mic_”,
*“麥克風的音量的大小:” + vusize); } else log.i(“ mic_”,“麥克風的音量的大小:” + 0);
*/
}
}
private void _handlerecordstart(){
//開始錄音的接收函數
tv.setText(“開始錄音...”);
//開始時間開始時間
}
private void _handlerecordstarterror(異常e){
//開始錄音的接收函數失敗
tv.setText(“開始錄音失敗:” + e.getMessage());
}
private void _handlereCordComplete(){
//結束錄音
tv.setText(“停止錄音:” +主題性);
}
私有void _handlerecordvoice(int _db){
//聲音事件偵聽,轉換成分貝
tvrecord.setText(“”+_ db);
}
@Override
public boolean onCreateOptionsMenu(菜單菜單){
//充氣菜單;如果存在,則將項目添加到動作欄中。
getMenuInflater()。充氣(R.Menu.Main,菜單);
返回true;
}
}