复制代码代码如下:
แพ็คเกจ 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;
Mainactivity ระดับสาธารณะขยายกิจกรรม {
Private Mediarecorder Recoder = null;
ผู้เล่น mediaplayer ส่วนตัว = null;
String Private String ธีม
TextView TV = NULL;
TextView tvRecord = null;
ปุ่ม testbtn = null;
ปุ่ม testbtn2 = null;
ปุ่ม stopbtn = null;
ปุ่ม playbtn = null;
@Override
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 = (ปุ่ม) findViewById (r.id.button1);
testbtn2 = (ปุ่ม) findViewById (r.id.button2);
stopbtn = (ปุ่ม) findViewById (r.id.buttonstop);
playbtn = (ปุ่ม) findViewById (r.id.buttonplay);
testbtn2.setontouchListener (ใหม่ ontouchListener () {
@Override
Public Boolean OnTouch (ดู V, Event MotionEvent) {
log.i ("testactivity", "setOntouchListener:"+event.getAction ());
switch (event.getAction ()) {
case motionEvent.action_up: {
log.i ("testactivity", "停止录音");
การหยุด ();
หยุดพัก;
-
case motionEvent.action_down: {
log.i ("testactivity", "开始录音");
StarTrecording ();
หยุดพัก;
-
ค่าเริ่มต้น: break;
-
กลับเท็จ;
-
-
testbtn.setonclicklistener (ใหม่ onclicklistener () {
โมฆะสาธารณะ onclick (ดู arg0) {
StarTrecording ();
testbtn.setenabled (เท็จ);
stopbtn.setenabled (จริง);
-
-
stopbtn.setenabled (เท็จ);
StopBtn.SetonClickListener (ใหม่ onClickListener () {
โมฆะสาธารณะ onclick (ดู arg0) {
การหยุด ();
testbtn.setenabled (จริง);
playbtn.setenabled (จริง);
stopbtn.setenabled (เท็จ);
-
-
playbtn.setonclicklistener (ใหม่ onclicklistener () {
โมฆะสาธารณะ onclick (ดู arg0) {
playrecordfile (ThemediaPath);
stopbtn.setenabled (จริง);
-
-
-
Void PlayRecordfile (สตริง _file) {
พยายาม {
ไฟล์ f = ไฟล์ใหม่ (_file);
ถ้า (! f.exists ()) {
tv.settext ("文件不存在:" + _file);
กลับ;
-
} catch (Exception e) {
log.i ("testactivity", e.getMessage ());
-
พยายาม {
ผู้เล่น = mediaPlayer ใหม่ ();
player.setDataSource (_file);
player.prepare ();
player.setoncompletionListener (ใหม่ oncompletionListener () {
โมฆะสาธารณะ oncompletion (mediaPlayer arg0) {
tv.settext ("播放完毕");
stopbtn.setenabled (เท็จ);
-
-
player.start ();
} catch (Exception e) {
log.e ("testactivity", "การเล่นล้มเหลว:" + 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 ();
ผู้เล่น release ();
ผู้เล่น = null;
-
-
-
* 开始录音处理
-
ได้รับการป้องกัน void startrecording () {
ThemediaPath = environment.getExternalStoragedirectory (). getAbsolutepath ();
ThemediaPath += "/audiotest.3gp";
recoder = ใหม่ 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 (Exception e) {
log.e ("testactivity", "ที่เตรียมไว้ล้มเหลว:" + e.getMessage ());
_handlerecordstarterror (e);
-
-
// 定时器
maxtime ยาวคงที่ส่วนตัว = 30*1000; // 30 秒
เริ่มต้นใช้งานจริงส่วนตัว = 0L;
endtime ส่วนตัวส่วนตัว = 0l;
Handler สุดท้ายส่วนตัว mhandler = new Handler ();
private runnable mupdatemicstatustimer = new runnable () {
โมฆะสาธารณะเรียกใช้ () {
// 判断是否超时
if (starttime> 0 && system.currentTimeMillis () - starttime> maxtime) {
log.e ("testactivity", "超时的录音时间, 直接停止");
การหยุด ();
กลับ;
-
// 更新分贝状态
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 ส่วนตัว = 300; // 间隔取样时间
โมฆะส่วนตัว updateMicStatus () {
if (recoder! = null) {
// int vusize = 10 * mmediarecorder.getMaxAmplitude () / 32768;
อัตราส่วน int = recoder.getMaxAmplitude () / ฐาน;
int db = 0; // 分贝
ถ้า (อัตราส่วน> 1)
db = (int) (20 * math.log10 (อัตราส่วน));
_handlerecordvoice (db);
mhandler.postdelayed (mupdatemicstatustimer, Space);
-
* ถ้า (db> 1) {vusize = (int) (20 * math.log10 (db)); log.i ("mic_",
* "麦克风的音量的大小:" + vusize); } else log.i ("mic_", "麦克风的音量的大小:" + 0);
-
-
-
โมฆะส่วนตัว _handlerecordstart () {
// 开始录音的接收函数
tv.settext ("开始录音 ... ");
// starttime 开始时间
-
โมฆะส่วนตัว _handlerecordstarterror (ข้อยกเว้น e) {
// 开始录音的接收函数失败
tv.settext ("开始录音失败:" + e.getMessage ());
-
โมฆะส่วนตัว _handlerecordcomplete () {
// 结束录音
tv.settext ("停止录音:" + ThemediaPath);
-
โมฆะส่วนตัว _handlerecordvoice (int _db) {
// 声音事件侦听, 转换成分贝
tvRecord.settext (""+_ db);
-
@Override
บูลีนสาธารณะ onCreateOptionSmenu (เมนูเมนู) {
// พองเมนู; สิ่งนี้จะเพิ่มรายการลงในแถบแอ็คชั่นหากมีอยู่
getMenuInflater (). พอง (r.menu.main, เมนู);
กลับมาจริง;
-
-