复制代码代码如下:
パッケージcom.example.testaudio;
java.io.fileをインポートします。
Android.App.Activityをインポートします。
Android.media.mediaplayerをインポートします。
Android.media.mediaplayer.oncompledionListenerをインポートします。
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をインポートします。
public class MainActivity extends Activity {
private MediaRecorder recoder = null;
プライベートMediaplayerプレーヤー= null;
プライベートストリングテーマエディアパス;
TextView TV = null;
textView TVRecord = null;
ボタンtestbtn = null;
ボタンtestbtn2 = null;
ボタンstopbtn = null;
ボタンplaybtn = null;
@オーバーライド
保護された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 =(ボタン)findViewByID(r.id.button2);
stopbtn =(button)findviewbyid(r.id.buttonstop);
playbtn =(button)findviewbyid(r.id.buttonplay);
testbtn2.setontouchListener(new ontouchListener(){
@オーバーライド
Public Boolean Ontouch(View V、MotionEventイベント){
log.i( "testactivity"、 "setontouchListener:"+event.getAction());
switch(event.getAction()){
case motionevent.action_up:{
log.i( "testactivity"、 "停止录音");
stopRecording();
壊す;
}
case motionevent.action_down:{
log.i( "testactivity"、 "开始录音");
startrecording();
壊す;
}
デフォルト:break;
}
falseを返します。
}
});
testbtn.setonclicklistener(new onclicklistener(){
public void onclick(arg0を表示){
startrecording();
testbtn.setEnabled(false);
stopbtn.setEnabled(true);
}
});
stopbtn.setEnabled(false);
stopBtn.setOnClickListener(new OnClickListener() {
public void onclick(arg0を表示){
stopRecording();
testbtn.setEnabled(true);
playbtn.setEnabled(true);
stopbtn.setEnabled(false);
}
});
playbtn.setonclicklistener(new onclicklistener(){
public void onclick(arg0を表示){
playRecordFile(themediapath);
stopbtn.setEnabled(true);
}
});
}
保護されたvoid playRecordFile(String _File){
試す {
ファイルf = newファイル(_file);
if(!f.exists()){
tv.settext( "文件不存在:" + _file);
戻る;
}
} catch(例外e){
log.i( "testactivity"、e.getmessage());
}
試す {
player = new Mediaplayer();
player.setDataSource(_file);
player.prepare();
player.setOncompledionListener(new oncomplediotingListener(){
public void oncompletion(mediaplayer arg0){
tv.settext( "播放完毕");
stopbtn.setEnabled(false);
}
});
player.start();
} catch(例外e){
log.e( "testactivity"、 "play failed:" + e.getmessage());
}
}
/**
*停止录音处理
*/
保護された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;
}
}
/**
*开始录音处理
*/
保護された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();
試す {
recoder.prepare();
recoder.start();
_handlerecordstart();
} catch(例外e){
log.e( "testactivity"、 "preated failed:" + e.getmessage());
_handlerecordstarterror(e);
}
}
//定时器
プライベート静的long maxtime = 30*1000; // 30秒
プライベートロングスタートタイム= 0L;
プライベートロングエンドタイム= 0L;
プライベートファイナルハンドラーmhandler = new Handler();
private runnable mupdatemicStatustimer = new runnable(){
public void run(){
//判断是否超时
if(starttime> 0 && system.currenttimemillis() - starttime> maxtime){
log.e( "testactivity"、 "超时的录音时间、直接停止");
stopRecording();
戻る;
}
//更新分贝状态
updatemicStatus();
}
};
/**
*更新话筒状态分贝是也就是相对响度分贝的计算公式k = 20lg(vo/vi)vo当前振幅值vi基准值为600:我是怎么制定基准值的呢? 20
* * math.log10(mmediarecorder.getmaxamplitude() / vi)== 0
*当我不对着麦克风说任何话的时候、测试获得的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比= recoder.getmaxamplitude() / base;
int db = 0; //分贝
if(比率> 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);
}
@オーバーライド
public boolean oncreateoptionsmenu(メニューメニュー){
//メニューを膨らませます。これにより、アクションバーが存在する場合にアイテムが追加されます。
getMenuinflater()。inflate(r.menu.main、menu);
trueを返します。
}
}