复制代码代码如下:
пакет com.example.testaudio;
Импорт java.io.file;
Импорт Android.App.Activity;
Импорт Android.Media.MediaPlayer;
Import Android.Media.MediaPlayer.oncompletionListener;
Импорт Android.Media.MediareCorder;
Импорт Android.os.bundle;
Импорт Android.os.Environment;
Импорт Android.os.handler;
Импорт Android.os.message;
Import Android.util.log;
Импорт Android.view.menu;
Import Android.View.motionEvent;
Импорт Android.View.View;
Import Android.view.view.onclickListener;
Import Android.View.View.OnouchListener;
Импорт Android.widget.button;
Import Android.widget.textView;
открытый класс MainActivity расширяет деятельность {
Частный MediareCorder Recoder = NULL;
Private MediaPlayer Player = null;
частная струнная темапат;
TextView TV = NULL;
TextView TVRecord = null;
Кнопка testBtn = null;
Кнопка testBtn2 = null;
Кнопка stopbtn = null;
Button playbtn = null;
@Override
Защищенная void oncreate (Bundle SavedInstanceState) {
Super.oncreate (saveInstanceState);
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);
testbtn22.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 ();
перерыв;
}
case motionevent.action_down: {
Log.i ("testactivity", "开始录音");
StarTecording ();
перерыв;
}
по умолчанию: перерыв;
}
вернуть ложь;
}
});
testbtn.setonclicklistener (new onclicklistener () {
public void onclick (view arg0) {
StarTecording ();
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 (темапат);
stopbtn.setEnabled (true);
}
});
}
Protected void PlayRecordFile (String _file) {
пытаться {
Файл f = новый файл (_file);
if (! f.exists ()) {
tv.settext ("文件不存在:" + _file);
возвращаться;
}
} catch (Exception e) {
Log.i ("testActivity", e.getMessage ());
}
пытаться {
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 Fail:" + 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 starTecording () {
theMediApath = Environment.GetExternalStorAgedIrectory (). getabSolutePath ();
емедиапат += "/audiotest.3gp";
Recoder = new MediareCorder ();
Recoder.setaudiosource (MediareCorder.Audiosource.mic);
recoder.setOutputFormat (mediareCorder.outputFormat.tre_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);
}
}
// 定时器
частный статический длинный максимум = 30*1000; // 30 秒
Private Long Starttime = 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.getmaxamplidout () / vi) == 0 的时候 vi 就是我所需要的基准值
* 当我不对着麦克风说任何话的时候 , 测试获得的 mmediareCorder.getMaxAmplitoud () 值即为基准值。
* Log.i ("mic_", "麦克风的基准值 :" + mmediarecorder.getMaxAmplitue ()); 前提时不对麦克风说任何话
*/
частная база int = 600;
частное пространство int = 300; // 间隔取样时间
private void updatemicstatus () {
if (Recoder! = null) {
// int vusize = 10 * mmediarecorder.getmaxamplitude () / 32768;
int catio = Recoder.getMaxAmplitude () / Base;
int db = 0; // 分贝
if (соотношение> 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 ("开始录音 ...");
// StartTime 开始时间
}
private void _handlerecordstarterror (Exception e) {
// 开始录音的接收函数失败
tv.settext ("开始录音失败:" + e.getmessage ());
}
private void _handlerecordcomplete () {
// 结束录音
tv.settext ("停止录音:" + емедиапат);
}
private void _handlerecordvoice (int _db) {
// 声音事件侦听 , 转换成分贝
tvrecord.settext (""+_ db);
}
@Override
Public Boolean OncreateOptionsmenu (меню меню)
// надувать меню; Это добавляет элементы к панели действий, если он присутствует.
getMenuInflater ().. Накачать (R.Menu.Main, меню);
вернуть истину;
}
}