复制代码代码如下:
paket com.example.testaudio;
impor java.io.file;
impor android.app.activity;
impor android.media.mediaplayer;
impor android.media.mediaplayer.onCompletionListener;
impor android.media.Mediarecorder;
impor android.os.bundle;
impor android.os.environment;
impor android.os.handler;
impor android.os.message;
impor android.util.log;
impor android.view.menu;
impor android.view.motionevent;
impor android.view.view;
impor android.view.view.onClickListener;
impor android.view.view.ontouchListener;
impor android.widget.button;
impor android.widget.textView;
MainActivity kelas publik memperluas aktivitas {
RECODER MediaRecorder Pribadi = NULL;
Pemain mediaplayer pribadi = null;
Private String Themediapath;
TextView TV = null;
TextView tvrecord = null;
Tombol testbtn = null;
Tombol testbtn2 = null;
Tombol stopbtn = null;
Tombol playbtn = null;
@Mengesampingkan
void onCreate yang dilindungi (bundle savedInstanceState) {
super.onCreate (savedInstancestrate);
setContentView (r.layout.activity_main);
TV = (TextView) findViewById (r.id.textView1);
tvRecord = (TextView) findViewById (r.id.tvrecord);
testBtn = (tombol) findViewById (r.id.button1);
testBtn2 = (tombol) findViewById (r.id.button2);
stopbtn = (tombol) findViewById (r.id.buttonstop);
playbtn = (tombol) findViewById (r.id.buttonplay);
testbtn2.setontouchListener (new OnTouchListener () {
@Mengesampingkan
OnTouch Boolean Publik (View V, Event MotionEvent) {
Log.i ("testActivity", "setontouchListener:"+event.getAction ());
switch (event.getAction ()) {
case motionevent.action_up: {
Log.i ("TestActivity", "停止录音");
stopRecording ();
merusak;
}
case motionevent.action_down: {
Log.i ("TestActivity", "开始录音");
startrecording ();
merusak;
}
default: break;
}
mengembalikan false;
}
});
testbtn.setOnclickListener (OnClickListener baru () {
public void onClick (lihat arg0) {
startrecording ();
testbtn.setenabled (false);
stopbtn.setenabled (true);
}
});
stopbtn.setenabled (false);
stopbtn.setonClickListener (OnClickListener baru () {
public void onClick (lihat arg0) {
stopRecording ();
testbtn.setenabled (true);
playbtn.setenabled (true);
stopbtn.setenabled (false);
}
});
playbtn.setOnclickListener (OnClickListener baru () {
public void onClick (lihat arg0) {
PlayRecordFile (Themediapath);
stopbtn.setenabled (true);
}
});
}
void playrecordfile yang dilindungi (string _file) {
mencoba {
File f = file baru (_file);
if (! f.exists ()) {
tv.setText ("文件不存在:" + _file);
kembali;
}
} catch (Exception e) {
Log.i ("testActivity", e.getMessage ());
}
mencoba {
player = mediaplayer baru ();
player.setDataSource (_file);
player.prepare ();
player.setOncompletionListener (OnCompletionListener baru () {
public void onCompletion (MediaPlayer arg0) {
tv.setText ("播放完毕");
stopbtn.setenabled (false);
}
});
player.start ();
} catch (Exception e) {
Log.e ("testActivity", "play gagal:" + e.getMessage ());
}
}
/**
* 停止录音处理
*/
stopRecording void yang dilindungi () {
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 ();
pemain = null;
}
}
/**
* 开始录音处理
*/
void startrecording () yang dilindungi () {
themediapath = lingkungan.getExternalStorageReCtory (). getabsolutePath ();
Themediapath += "/Audiotest.3GP";
recoder = mediarecorder baru ();
Recoder.setaudiosource (mediarecorder.audiosource.mic);
recoder.setoutputFormat (mediarecorder.outputformat.theree_gpp);
Recoder.setoutputFile (Themediapath);
recoder.setAudioencoder (mediarecorder.audioencoder.amr_nb);
startTime = system.currentTimeMillis ();
UpdateMicStatus ();
mencoba {
recoder.prepare ();
Recoder.start ();
_HandlerecordStart ();
} catch (Exception e) {
Log.e ("testActivity", "disiapkan gagal:" + e.getMessage ());
_handlerecordstarterror (e);
}
}
// 定时器
maxTime panjang statis pribadi = 30*1000; // 30 秒
Private Long Starttime = 0L;
Private Long Endtime = 0L;
Private Final Handler Mhandler = New Handler ();
Private Runnable MupDateMicStatustimer = new runnable () {
public void run () {
// 判断是否超时
if (startTime> 0 && System.currentTimeMillis () - startTime> maxTime) {
Log.e ("testactivity", "超时的录音时间 , 直接停止");
stopRecording ();
kembali;
}
// 更新分贝状态
UpdateMicStatus ();
}
};
/**
* 更新话筒状态 分贝是也就是相对响度 分贝的计算公式 k = 20lg (vo/vi) vo 当前振幅值 vi 基准值为 600 : 我是怎么制定基准值的呢? 当 20
* * Math.log10 (mmediarecorder.getmaxamplitude () / vi) == 0 的时候 vi 就是我所需要的基准值
* 当我不对着麦克风说任何话的时候 , 测试获得的 mmediarecorder.getmaxamplitude () 值即为基准值。
* Log.i ("mic_", "麦克风的基准值 :" + mmediarecorder.getmaxamplitude ()); 前提时不对麦克风说任何话
*/
basis int pribadi = 600;
ruang int pribadi = 300; // 间隔取样时间
private void updateMicStatus () {
if (recoder! = null) {
// int vusize = 10 * mmediarecorder.getmaxamplitude () / 32768;
rasio int = recoder.getmaxamplitude () / basis;
int db = 0; // 分贝
if (rasio> 1)
db = (int) (20 * Math.log10 (rasio));
_handlerecordvoice (db);
mhandler.postdelayed (mupdatemicstatustimer, ruang);
/*
* 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 (pengecualian e) {
// 开始录音的接收函数失败
tv.setText ("开始录音失败:" + e.getMessage ());
}
private void _handlerecordcomplete () {
// 结束录音
tv.setText ("停止录音:" + themediapath);
}
private void _handlerecordvoice (int _db) {
// 声音事件侦听 , 转换成分贝
tvrecord.setText (""+_ dB);
}
@Mengesampingkan
public boolean onCreateOptionsMenu (menu menu) {
// mengembang menu; Ini menambahkan item ke bilah aksi jika ada.
getmenuinflater (). mengembang (r.menu.main, menu);
Kembali Benar;
}
}