复制代码代码如下:
paquete com.example.testaudio;
import java.io.file;
importar android.app.activity;
importar android.media.mediaPlayer;
importar android.media.mediaplayer.oncompletionListener;
importar android.media.mediarecorder;
importar android.os.bundle;
importar android.os.environment;
importar android.os.handler;
importar android.os.message;
importar android.util.log;
importardroid.view.menu;
importar android.view.motionEvent;
importar android.view.view;
importar android.view.view.OnclickListener;
importar android.view.view.onTouchListener;
importardroid.widget.button;
importardroid.widget.textView;
La clase pública MainActivity extiende la actividad {
privado mediareCorder recoder = null;
Player privado de mediasplayer = nulo;
Cadena privada Temediapath;
TextView tv = null;
TextView tvRecord = null;
Botón testbtn = null;
Botón testbtn2 = null;
Botón stopBtn = nulo;
Botón playbtn = null;
@Anular
nulo protegido OnCreate (Bundle SavedInstancestate) {
super.Oncreate (SavedInstancestate);
setContentView (r.layout.activity_main);
TV = (TextView) FindViewById (r.id.TextView1);
TVRecord = (TextView) FindViewById (r.id.tvrecord);
testbtn = (botón) findViewById (R.id.Button1);
testbtn2 = (botón) findViewByid (R.id.Button2);
stopBtn = (botón) findViewByid (r.id.buttonstop);
playbtn = (botón) findViewByid (r.id.buttonplay);
testBtn2.SetTouchListener (new OnTouchListener () {
@Anular
Public Boolean OnTouch (View V, Evento de MotionEvent) {
Log.i ("testActivity", "setToTouchListener:"+event.getAction ());
switch (event.getAction ()) {
Case MotionEvent.Action_UP: {
Log.i ("testActivity", "停止录音");
stopRecording ();
romper;
}
Case MotionEvent.Action_down: {
Log.i ("testActivity", "开始录音");
Startrecording ();
romper;
}
predeterminado: ruptura;
}
devolver falso;
}
});
testbtn.setOnClickListener (new OnClickListener () {
public void onclick (ver arg0) {
Startrecording ();
testbtn.setEnabled (falso);
stopBtn.SetEnabled (verdadero);
}
});
stopBtn.SetEnabled (falso);
stopBtn.setOnClickListener (new onClickListener () {
public void onclick (ver arg0) {
stopRecording ();
testbtn.setEnabled (true);
playbtn.setEnabled (true);
stopBtn.SetEnabled (falso);
}
});
playbtn.setOnClickListener (new onClickListener () {
public void onclick (ver arg0) {
PlayRecordFile (themediaPath);
stopBtn.SetEnabled (verdadero);
}
});
}
protegido void playRecordFile (string _file) {
intentar {
Archivo f = nuevo archivo (_file);
if (! f.exists ()) {
tv.settext ("文件不存在:" + _file);
devolver;
}
} Catch (Exception e) {
Log.i ("testActivity", e.getMessage ());
}
intentar {
Player = new MediaPlayer ();
Player.SetDataSource (_file);
Player.prepare ();
Player.SetOnCompletionListener (nuevo OnCompletionListener () {
public void onCompletion (MediaPlayer Arg0) {
tv.settext ("播放完毕");
stopBtn.SetEnabled (falso);
}
});
Player.Start ();
} Catch (Exception e) {
Log.e ("testActivity", "Play falló:" + e.getMessage ());
}
}
/**
* 停止录音处理
*/
protegido vacío stopRecording () {
if (recoder! = null) {
Log.i ("testActivity", "停止录音");
recoder.stop ();
recoder.Release ();
recoder = nulo;
EndTime = System.CurrentTimemillis ();
_HandlerecordComplete ();
}
if (jugador! = null) {
Log.i ("testActivity", "停止播放");
jugador.stop ();
Player.Release ();
jugador = nulo;
}
}
/**
* 开始录音处理
*/
protegido vacío Startrecording () {
themediaPath = Environment.getExternalStoreGentirectory (). getAbSolutePath ();
themediaPath += "/audiotest.3gp";
recoder = new MediareCorder ();
recoder.setaudiosurce (mediareCorder.audiosaurce.mic);
recoder.setOutputFormat (mediareCorder.outputFormat.three_gpp);
recoder.setOutputFile (themediaPath);
recoder.setaudioencoder (mediareCorder.audioencoder.amr_nb);
starttime = system.currentTimemillis ();
updatemicStatus ();
intentar {
recoder.prepare ();
recoder.start ();
_HandlerecordStart ();
} Catch (Exception e) {
Log.e ("testActivity", "preparado fallido:" + e.getMessage ());
_HandlerecordStarterror (e);
}
}
// 定时器
Maxte de larga estática privada = 30*1000; // 30 秒
Private Long Starttime = 0l;
Private Long Endtime = 0l;
Handler final privado mhandler = new Handler ();
private runnable mupdatemicstatustimer = new Runnable () {
public void run () {
// 判断是否超时
if (starttime> 0 && system.currentTimemillis () - starttime> maxtime) {
Log.e ("testActivity", "超时的录音时间 , 直接停止");
stopRecording ();
devolver;
}
// 更新分贝状态
updatemicStatus ();
}
};
/**
* 更新话筒状态 分贝是也就是相对响度 分贝的计算公式 K = 20lg (Vo/VI) Vo 当前振幅值 VI 基准值为 600 : 我是怎么制定基准值的呢? 当 20
* * Math.log10 (mmediarecorder.getMaxAmplitude () / VI) == 0 的时候 VI 就是我所需要的基准值
* 当我不对着麦克风说任何话的时候 测试获得的 测试获得的 mmediarecorder.getMaxAmplitude () 值即为基准值。
* Log.i ("Mic_", "麦克风的基准值 :" + Mmediarecorder.getMaxAmplitude ()); 前提时不对麦克风说任何话
*/
base privada int = 600;
private int espacio = 300; // 间隔取样时间
Vacío privado updatemicStatus () {
if (recoder! = null) {
// int vusize = 10 * mmediareCorder.getMaxAmplitude () / 32768;
int ratio = recoder.getMaxAmplitude () / base;
int db = 0; // 分贝
if (relación> 1)
db = (int) (20 * math.log10 (relación));
_HandlerecordVoice (db);
mhandler.postdelayed (MupdatemicStatustimer, espacio);
/*
* if (db> 1) {vusize = (int) (20 * math.log10 (db)); Log.i ("Mic_",
* "麦克风的音量的大小 :" + VUSIZE); } else log.i ("Mic_", "麦克风的音量的大小 :" + 0);
*/
}
}
Void privado _handlerecordStart () {
// 开始录音的接收函数
tv.settext ("开始录音 ...");
// Starttime 开始时间
}
Void privado _handlerecordSteRterror (Excepción e) {
// 开始录音的接收函数失败
tv.settext ("开始录音失败:" + e.getMessage ());
}
Void privado _handlerecordComplete () {
// 结束录音
tv.settext ("停止录音:" + themediaPath);
}
privado void _handlerecordVoice (int _db) {
// 声音事件侦听 转换成分贝 转换成分贝
tvRecord.setText (""+_ db);
}
@Anular
Public boolean onCreateptionsMenu (menú menú) {
// inflar el menú; Esto agrega elementos a la barra de acción si está presente.
getMenuinflater (). Inflate (R.Menu.Main, menú);
devolver verdadero;
}
}