首先創建一個RecordActivity,用來錄製聲音用的class。
processViews();
findViewById找到對應元件。
Intent intent = getIntent();
fileName = intent.getStringExtra("fileName");
//取消,確定
public void onSubmit(View view) {
if (isRecording) {
// 停止錄音
myRecoder.stop();
}
// 確定
if (view.getId() == R.id.record_ok) {
Intent result = getIntent();
setResult(Activity.RESULT_OK, result);
}
finish();
}
public void clickRecord(View view) {
// 切換
isRecording = !isRecording;
// 開始錄音
if (isRecording) {
// 設定按鈕圖示為錄音中
record_button.setImageResource(R.drawable.ic_keyboard_voice_red_24dp);
// 建立錄音物件
myRecoder = new MyRecoder(fileName);
// 開始錄音
myRecoder.start();
// 建立並執行顯示麥克風音量的AsyncTask物件
new MicLevelTask().execute();
}
// 停止錄音
else {
// 設定按鈕圖示為停止錄音
record_button.setImageResource(R.drawable.ic_keyboard_voice_black_24dp);
// 麥克風音量歸零
record_volumn.setProgress(0);
// 停止錄音
myRecoder.stop();
}
}
// 建立錄音物件,參數為錄音儲存的位置與檔名
MyRecoder(String output) {
this.output = output;
}
// 開始錄音
public void start() {
if (recorder == null) {
// 建立錄音用的MediaRecorder物件
recorder = new MediaRecorder();
// 設定錄音來源為麥克風,必須在setOutputFormat方法之前呼叫
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
// 設定輸出格式為3GP壓縮格式,必須在setAudioSource方法之後,
// 在prepare方法之前呼叫
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
// 設定錄音的編碼方式,必須在setOutputFormat方法之後,
// 在prepare方法之前呼叫
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
// 設定輸出的檔案名稱,必須在setOutputFormat方法之後,
// 在prepare方法之前呼叫
recorder.setOutputFile(output);
try {
// 準備執行錄音工作,必須在所有設定之後呼叫
recorder.prepare();
}
catch (IOException e) {
Log.d("RecordActivity", e.toString());
}
// 開始錄音
recorder.start();
mEMA = 0.0;
}
}
// 停止錄音
public void stop() {
if (recorder != null) {
// 停止錄音
recorder.stop();
// 清除錄音資源
recorder.release();
recorder = null;
}
}
public double getAmplitude() {
if (recorder != null)
return (recorder.getMaxAmplitude() / 2700.0);
else
return 0;
}
// 取得麥克風音量
public double getAmplitudeEMA() {
double amp = getAmplitude();
mEMA = EMA_FILTER * amp + (1.0 - EMA_FILTER) * mEMA;
return mEMA;
}
}