复制代码代码如下:
package com.example.testAudio;
Importer java.io.file;
import Android.App.activité;
import android.media.mediaplayer;
import android.media.mediaplayer.oncompletionListener;
import android.media.mediaRecorder;
import android.os.bundle;
import android.os.environment;
import Android.os.Handler;
import Android.os.Message;
import android.util.log;
import android.view.menu;
import android.view.motionEvent;
import Android.view.view;
import Android.view.view.OnClickListener;
import Android.view.view.ontouchListener;
import android.widget.button;
import Android.Widget.TextView;
classe publique MainActivity étend l'activité {
Recordeur médiariomètre privé = null;
Private MediaPlayer Player = NULL;
THEMEDIAPATH PRIVÉE;
TextView tv = null;
TextView TVRecord = NULL;
Button TestBtn = NULL;
Button TestBtn2 = NULL;
Button stopTBtn = null;
Bouton playBtn = null;
@Outrepasser
vide protégé sur onCreate (bundle SavedInstancEstate) {
super.onCreate (SavedInstancEstate);
setContentView (r.layout.activity_main);
tv = (textView) findViewByid (r.id.textView1);
tvRecord = (textView) findViewByid (r.id.tvrecord);
TestBtn = (Button) findViewById (R.Id.Button1);
TestBtn2 = (Button) findViewByid (R.Id.Button2);
stopBtn = (bouton) findViewByid (r.id.buttonstop);
playBtn = (bouton) findViewByid (r.id.buttonplay);
TestBtn2.SetontouchListener (new OntouchListener () {
@Outrepasser
Public Boolean Ontouch (View V, MotionEvent Event) {
Log.i ("testActivity", "setontouchListener:" + event.getAction ());
switch (event.getAction ()) {
Case motionEvent.action_up: {
Log.i ("testActivity", "停止录音");
stopRecording ();
casser;
}
Case MotionEvent.Action_Down: {
Log.i ("testActivity", "开始录音");
StarTrecorDing ();
casser;
}
par défaut: pause;
}
retourne false;
}
});
TestBtn.SetOnClickListener (new onClickListener () {
public void onclick (voir arg0) {
StarTrecorDing ();
TestBtn.SetEnabled (false);
stopTBtn.SetEnabled (true);
}
});
stopTBtn.SetEnabled (false);
stopTBtn.setOnClickListener (new onclickListener () {
public void onclick (voir arg0) {
stopRecording ();
TestBtn.SetEnabled (true);
playBtn.SetEnabled (true);
stopTBtn.SetEnabled (false);
}
});
playBtn.setOnClickListener (new onClickListener () {
public void onclick (voir arg0) {
PlayRecordFile (ThemedIaPath);
stopTBtn.SetEnabled (true);
}
});
}
protégé void playRecordFile (String _file) {
essayer {
Fichier f = nouveau fichier (_file);
if (! f.exists ()) {
tv.setText ("文件不存在:" + _file);
retour;
}
} catch (exception e) {
Log.i ("testActivity", e.getMessage ());
}
essayer {
le player = new mediaPlayer ();
player.setDataSource (_file);
le player.prepare ();
player.setOnCompletionListener (new onCompletionListener () {
public void onCompletion (MediaPlayer Arg0) {
tv.seTText ("播放完毕");
stopTBtn.SetEnabled (false);
}
});
player.start ();
} catch (exception e) {
Log.e ("testActivity", "Play a échoué:" + e.getMessage ());
}
}
/ **
* 停止录音处理
* /
protégée vide stoprefording () {
if (recoder! = null) {
Log.i ("testActivity", "停止录音");
recoder.stop ();
recoder.release ();
recoder = null;
endtime = system.currentTimemillis ();
_HandleRecordComplete ();
}
if (joueur! = null) {
Log.i ("testActivity", "停止播放");
player.stop ();
Player.release ();
lecteur = null;
}
}
/ **
* 开始录音处理
* /
protégée void starTrecording () {
themedIaPath = Environment.getExternalStorageDirectory (). getAbsoluTepath ();
ThemeDiaPath + = "/ Audiotest.3gp";
recoder = new MediaRecorder ();
recoder.setAudiosource (mediatercorder.audiosource.mic);
recoder.setOutputFormat (mediatercorder.outputformat. trois_gpp);
recoder.setOutputFile (thèmediapath);
recoder.setAudioencoder (mediatercorder.audioencoder.amr_nb);
startTime = System.CurrentTimemillis ();
UpdateMicStatus ();
essayer {
recoder.prepare ();
recoder.start ();
_HandleRecordStart ();
} catch (exception e) {
Log.e ("testActivity", "préparé échoué:" + e.getMessage ());
_handlerecordStarterror (e);
}
}
// 定时器
MAXTIME LONNE STATIQUE privée = 30 * 1000; // 30 秒
Private Long StartTime = 0L;
Fin de fin privé = 0l;
Handler final privé mhandler = new handler ();
private runnable mupdatemicstatustimer = new runnable () {
public void run () {
// 判断是否超时
if (starttime> 0 && system.currentTimemillis () - starttime> maxtime) {
Log.e ("testActivity", "超时的录音时间 , 直接停止");
stopRecording ();
retour;
}
// 更新分贝状态
UpdateMicStatus ();
}
};
/ **
* 更新话筒状态 分贝是也就是相对响度 分贝的计算公式 k = 20lg (vo / vi) vo 当前振幅值 vi 基准值为 600: : 我是怎么制定基准值的呢? 当 20
* * Math.log10 (mmediaRecorder.getMaxAmplitude () / vi) == 0 的时候 VI 就是我所需要的基准值
* 当我不对着麦克风说任何话的时候 , 测试获得的 mmediaRecorder.getMaxAmplitude () 值即为基准值。
* Log.i ("mic_", "麦克风的基准值 :" + mmediatercorder.getMaxAmplitude ()); 前提时不对麦克风说任何话
* /
base int privé = 600;
Espace int privé = 300; // 间隔取样时间
private void updatemicstatus () {
if (recoder! = null) {
// int vusize = 10 * mmediaRecorder.getMaxAmplitude () / 32768;
int ratio = recoder.getMaxAmplitude () / base;
int db = 0; // 分贝
if (ratio> 1)
db = (int) (20 * math.log10 (rapport));
_HandlerecordVoice (db);
mhandler.postdelayed (MupdatemicStatustimer, espace);
/ *
* 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 privé _handlerecordstarterror (exception e) {
// 开始录音的接收函数失败
tv.seTText ("开始录音失败:" + e.getMessage ());
}
private void _handlerecordComplete () {
// 结束录音
tv.setText ("停止录音:" + thèmediaPath);
}
private void _handlerecordVoice (int _db) {
// 声音事件侦听 , 转换成分贝
tvRecord.SeTText ("" + _ db);
}
@Outrepasser
public boolean onCreateOptionsMenu (menu menu) {
// gonfler le menu; Cela ajoute des éléments à la barre d'action s'il est présent.
getMenuinflater (). Fine (r.menu.main, menu);
Retour Vrai;
}
}