复制代码代码如下 :
패키지 com.example.testaudio;
import java.io.file;
android.app.Activity 가져 오기;
import android.media.mediaplayer;
import android.media.mediaplayer.oncompletionListener;
Import Android.media.mediarecorder;
android.os.bundle 가져 오기;
android.os.environment 가져 오기;
android.os.handler 가져 오기;
android.os.message 가져 오기;
android.util.log 가져 오기;
안드로이드 view.menu 가져 오기;
안드로이드를 가져옵니다 .View.MotionEvent;
안드로이드를 가져옵니다. view.view;
안드로이드를 가져옵니다. view.view.onclicklistener;
안드로이드를 가져옵니다. view.view.ontouchListener;
Import Android.widget.button;
import android.widget.textView;
공개 클래스 메인 활동은 활동을 확장합니다.
개인 MediareCorder Recoder = null;
개인 미디어 플레이어 플레이어 = null;
개인 문자열 테마;
TextView TV = NULL;
TextView TVrecord = null;
버튼 testbtn = null;
버튼 testbtn2 = null;
버튼 stopbtn = null;
버튼 playbtn = null;
@보수
보호 된 void onCreate (번들 SavedInstancestate) {
Super.oncreate (SavedInstancestate);
setContentView (R.Layout.Activity_Main);
TV = (TextView) findViewById (r.id.textView1);
tvrecord = (textView) findViewById (r.id.tvrecord);
testbtn = (버튼) findViewById (r.id.button1);
testbtn2 = (버튼) findViewById (r.id.button2);
stopbtn = (버튼) findViewById (r.id.buttonstop);
playbtn = (버튼) 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 ();
부서지다;
}
기본값 : 브레이크;
}
거짓을 반환합니다.
}
});
testbtn.setonclicklistener (new onclicklistener () {
공개 void onclick (view arg0) {
Startrecording ();
testbtn.setenabled (false);
stopbtn.setenabled (true);
}
});
stopbtn.setenabled (false);
stopbtn.setonclicklistener (new onclicklistener () {
공개 void onclick (view arg0) {
stoprecording ();
testBtn.setEnabled (true);
playbtn.setenabled (true);
stopbtn.setenabled (false);
}
});
playbtn.setonclicklistener (new onclicklistener () {
공개 void onclick (view arg0) {
PlayRecordFile (테마);
stopbtn.setenabled (true);
}
});
}
보호 된 void playRecordFile (String _file) {
노력하다 {
파일 f = 새 파일 (_file);
if (! f.exists ()) {
tv.settext ( "文件不存在 :" + _file);
반품;
}
} catch (예외 e) {
log.i ( "testactivity", e.getMessage ());
}
노력하다 {
Player = New MediaPlayer ();
player.setDatasource (_file);
player.prepare ();
player.setonCompletionListener (New OnCompletionListener () {
공개 void oncompletion (MediaPlayer Arg0) {
tv.settext ( "播放完毕");
stopbtn.setenabled (false);
}
});
player.start ();
} catch (예외 e) {
log.e ( "testactivity", "Play 실패 :" + e.getMessage ());
}
}
/**
* 停止录音处理
*/
보호 된 void stoprecording () {
if (recoder! = null) {
log.i ( "testactivity", "停止录音");
recoder.stop ();
recoder.release ();
레코더 = null;
endtime = System.CurrentTimeMillis ();
_handlereCordComplete ();
}
if (player! = null) {
log.i ( "testactivity", "停止播放");
player.stop ();
player.release ();
플레이어 = null;
}
}
/**
* 开始录音处理
*/
보호 된 void startrecording () {
ThemediaPath = Environment.getexternalstoragedirectory (). getAbsolutepath ();
ThemediaPath += "/audiotest.3gp";
레코더 = 새로운 MediareCorder ();
Recoder.setaudiosource (mediarecorder.audiosource.mic);
recoder.setoutputformat (mediarecorder.outputformat.three_gpp);
recoder.setoutputfile (테마);
recoder.setaudioender (mediarecorder.audioencoder.amr_nb);
STARTTIME = SYSTEM.CURRENTTIMEMILLIS ();
UpdatemicStatus ();
노력하다 {
recoder.prepare ();
recoder.start ();
_handlereCordStart ();
} catch (예외 e) {
log.e ( "testactivity", "준비 실패 :" + e.getMessage ());
_handlerecordstarterror (e);
}
}
// 定时器
개인 정적 긴 maxtime = 30*1000; // 30 秒
개인 장거리 시작 시간 = 0l;
개인 장기 종료 = 0L;
개인 최종 핸들러 MHANDLER = New Handler ();
개인 실행 가능한 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 的时候 vi 就是我所需要的基准值
* 测试获得的 测试获得的, , mmediarecorder.getMaxAmplitude () 值即为基准值。
* log.i ( "mic_", "麦克风的基准值 :" + mmediarecorder.getmaxamplitude ());
*/
개인 int 기지 = 600;
개인 int space = 300; // 间隔取样时间
개인 void updatemicstatus () {
if (recoder! = null) {
// int vusize = 10 * mmediareCorder.getMaxAmplitude () / 32768;
int ratio = recoder.getmaxamplitude () / base;
int db = 0; // 分贝
if (비율> 1)
db = (int) (20 * math.log10 (비율));
_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 开始时间
}
개인 void _handlerecordstarterror (예외 E) {
// 开始录音的接收函数失败
tv.settext ( "开始录音失败 :" + e.getMessage ());
}
private void _handlerecordComplete () {
// 结束录音
tv.settext ( "停止录音 :" + ThemediaPath);
}
개인 void _handlerecordvoice (int _db) {
// 声音事件侦听, 声音事件侦听
TVrecord.settext ( ""+_ db);
}
@보수
공개 부울 OnCreateOptionsMenu (메뉴 메뉴) {
// 메뉴가 부풀립니다. 이 경우 액션 바에 항목이 추가되어 있으면 항목이 추가됩니다.
getMenuinflater (). 팽창 (r.menu.main, menu);
진실을 반환하십시오.
}
}