复制代码代码如下::
Paket com.example.Testaudio;
Import Java.io.file;
importieren android.app.Activity;
Import Android.Media.MediaPlayer;
import android.media.mediaPlayer.onCompletionListener;
Import Android.Media.MediareCorder;
importieren Android.os.bundle;
Import Android.os.Environment;
Import Android.os.handler;
import Android.os.message;
import Android.util.log;
importieren android.view.menu;
android.view.MotionEvent importieren;
android.view.view importieren;
Importieren Sie Android.view.View.onclickListener;
Importieren Sie Android.view.View.ontouchListener;
importieren Android.widget.button;
android.widget.textView importieren;
Mainaktivität der öffentlichen Klasse erweitert die Aktivität {
privatem Mediarecorder Recodierer = NULL;
privater Medienplayer Player = null;
private String -ThemenediaPath;
TextView tv = null;
TextView tvecord = null;
Button testBtn = null;
Button TestBTN2 = NULL;
Button stopBtn = null;
Button PlayBtn = null;
@Override
geschützte void Oncreate (Bündel 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 = (Button) findViewById (R.Id.ButtonStop);
PlayBtn = (Button) findViewById (R.Id.Buttonplay);
testBtn2.SetontouchListener (new OnTouchListener () {
@Override
public boolean OnTouch (Ansicht v, motionEvent Ereignis) {
Log.i ("testActivity", "setontouchListener:"+event.getAction ());
Switch (Event.Getaction ()) {
case motionEvent.action_up: {
Log.i ("testActivity", "停止录音");
stopp -cording ();
brechen;
}
case motionEvent.action_down: {
Log.i ("testActivity", "开始录音");
startercording ();
brechen;
}
Standard: Break;
}
false zurückgeben;
}
});
testBtn.setonClickListener (new OnclickListener () {
public void onclick (view arg0) {
startercording ();
testBtn.setEnabled (false);
stopBtn.setEnabled (true);
}
});
stopBtn.setEnabled (false);
STOPBTN.SETONCLICKLISTENER (New OnclickListener () {
public void onclick (view arg0) {
stopp -cording ();
testBtn.setEnabled (true);
PlayBtn.SetEnabled (true);
stopBtn.setEnabled (false);
}
});
PlayBtn.SetonClickListener (new OnclickListener () {
public void onclick (view arg0) {
PlayRecordfile (ThemeediaPath);
stopBtn.setEnabled (true);
}
});
}
Protected void PlayRecordfile (String _file) {
versuchen {
Datei f = neue Datei (_file);
if (! f.Exists ()) {
tv.setText ("文件不存在:" + _file);
zurückkehren;
}
} catch (Ausnahme e) {
Log.i ("testActivity", e.getMessage ());
}
versuchen {
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 (Ausnahme e) {
Log.e ("testActivity", "spiele fehlgeschlagen:" + e.getMessage ());
}
}
/**
* 停止录音处理
*/
geschützte void stoprecording () {
if (Recodier! = NULL) {
Log.i ("testActivity", "停止录音");
Recodier.Stop ();
recododer.release ();
recodier = null;
EndTime = System.currentTimemillis ();
_HandlereCordComplete ();
}
if (player! = null) {
Log.i ("testActivity", "停止播放");
Player.Stop ();
Player.Release ();
Player = null;
}
}
/**
* 开始录音处理
*/
geschützte void startercording () {
themediapath = Umwelt
themediaPath += "/Audotest.3gp";
recododer = neuer mediarecorder ();
recododer.setaudiosource (mediarecorder.audiosource.mic);
recododer.setoutputFormat (MediareCorder.OutputFormat.Three_GPP);
recododer.setoutputfile (themediaPath);
recododer.setaudioEncoder (MediareCorder.audioEncoder.amr_nb);
startTime = system.currentTimemillis ();
UpdatemicStatus ();
versuchen {
recodier.prepare ();
recododer.start ();
_HandlereCordstart ();
} catch (Ausnahme e) {
Log.e ("testActivity", "vorbereitet fehlgeschlagen:" + e.getMessage ());
_HandlereCordstarterror (e);
}
}
// 定时器
private statische lange Maxtime = 30*1000; // 30 秒
private long starttime = 0l;
private lange Endzeit = 0L;
privater Final Handler Mhandler = New Handler ();
private runnable mupdatemicStatustimer = new Runnable () {
public void run () {
// 判断是否超时
if (starttime> 0 && system.currenttimemillis () - starttime> maxime) {
Log.e ("testActivity", "超时的录音时间 , 直接停止");
stopp -cording ();
zurückkehren;
}
// 更新分贝状态
UpdatemicStatus ();
}
};
/**
* 更新话筒状态 分贝是也就是相对响度 k = 20lg (vo/vi) vo 当前振幅值 vi 基准值为 600 : 我是怎么制定基准值的呢? 当 当 当 当 当 当 当 当 当 当 当 当 当 当 当 当 当 当 当 当 当 当 当 当 当 更新话筒状态 更新话筒状态 更新话筒状态 当 当 当 当 当 当 当 当 当 当 当 当 当 当 当 当 当 当 当 当)
* * Math.log10 (mmediarecorder.getMaxAmplitude () / vi) == 0 的时候 vi 就是我所需要的基准值
* 当我不对着麦克风说任何话的时候 , 测试获得的 mmediarecorder.getMaxAmplitude () 值即为基准值。
* Log.i ("mic_", "麦克风的基准值 :" + mmediarecorder.getMaxAmplitude ()); 前提时不对麦克风说任何话
*/
private int base = 600;
Privat int Space = 300; // 间隔取样时间
private void updatemicStatus () {
if (Recodier! = NULL) {
// int vusize = 10 * mmediarecorder.getMaxAmplitude () / 32768;
Int -Verhältnis = recododer.getMaxAmplitude () / base;
int db = 0; // 分贝
if (Verhältnis> 1)
db = (int) (20 * math.log10 (Verhältnis));
_HandlereCordVoice (db);
mhandler.postdelayed (MupdatemicStatustimer, Raum);
/*
* 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 (Ausnahme e) {
// 开始录音的接收函数失败
tv.setText ("开始录音失败:" + e.getMessage ());
}
private void _handlerecordComplete () {
// 结束录音
tv.setText ("停止录音:" + themediaPath);
}
private void _handlerecordvoice (int _db) {
// 声音事件侦听 , 转换成分贝
TVRecord.setText (""+_ DB);
}
@Override
public boolean OncreateOptionsmenu (Menümenü) {
// das Menü aufblasen; Dies fügt der Aktionsleiste Elemente hinzu, wenn sie vorhanden ist.
getMenuinflater (). Aufblasen (R.Menu.Main, Menü);
zurückkehren;
}
}