手機一般都提供了麥克風硬件,而Android系統就可以利用該硬件來錄制音頻了。
為了在Android應用中錄制音頻,Android提供了MediaRecorder類,使用MediaRecorder錄制音頻的過程如下:
1、創建MediaRecorder對象。
2、調用MediaRecorder對象的setAudioSource()方法設置聲音來源,一般傳入MediaRecorder.AudioSource.MIC參數指定錄制來自麥克風的聲音。
3、調用MediaRecorder對象的setOutputFormat()設置所錄制的音頻文件的格式。
4、調用MediaRecorder對象的setAudioEncoder()、setAudioEncodingBitRate(int bitRate)、setAudioSamplingRate(int samplingRate)設置所錄制的聲音的編碼格式、編碼位率、采樣率等,這些參數將可以控制所錄制的聲音的品質、文件的大小。一般來說,聲音品質越好,聲音文件越大。
5、調用MediaRecorder的setOutputFile(String path)方法設置錄制的音頻文件的保存位置。
6、調用MediaRecorder的prepare()方法准備錄制。
7、調用MediaRecorder對象的start()方法開始錄制。
8
錄制完成,調用MediaRecorder對象的stop()方法停止錄制,並調用release()方法釋放資源。
注:步驟3、4兩個步驟千萬不能搞反,否則程序將會拋出IllegalStateException異常。
import java.io.File;
import java.io.IOException;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.Toast;
public class RecodeSound extends Activity implements OnClickListener{
//程序中的按鈕
ImageButton recode;
ImageButton stop;
//系統的音頻文件
File soundFile;
MediaRecorder mRecorder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recode_sound);
//獲取程序界面中的兩個按鈕
recode = (ImageButton) findViewById(R.id.recode);
stop = (ImageButton) findViewById(R.id.stop);
//為兩個按鈕的單擊事件綁定監聽器
recode.setOnClickListener(this);
stop.setOnClickListener(this);
}
@Override
protected void onDestroy() {
if(soundFile != null && soundFile.exists()){
//停止錄音
mRecorder.stop();
//釋放資源
mRecorder.release();
mRecorder = null;
}
super.onDestroy();
}
@Override
public void onClick(View source) {
switch(source.getId()){
//單擊錄音按鈕
case R.id.recode:
if(!Environment.getExternalStorageState()
.equals(android.os.Environment.MEDIA_MOUNTED)){
Toast.makeText(RecodeSound.this, "SD卡不存在,請插入SD卡", 5000).show();
return;
}
try {
//創建保存錄音的音頻文件
soundFile = new File(Environment.getExternalStorageDirectory().getCanonicalFile()+"/sound.amr");
mRecorder = new MediaRecorder();
//設置錄音的聲音來源
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
//設置錄制的聲音的輸出格式(必須在設置聲音編碼格式之前設置)
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
//設置聲音編碼的格式
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setOutputFile(soundFile.getAbsolutePath());
mRecorder.prepare();
//開始錄音
mRecorder.start();
} catch (IOException e) {
e.printStackTrace();
}
break;
//單擊停止按鈕
case R.id.stop:
if(soundFile != null && soundFile.exists()){
//停止錄音
mRecorder.stop();
//釋放資源
mRecorder.release();
mRecorder = null;
}
break;
}
}
}
錄制完成后將可以看到/mnt/sdcard/目錄下生成一個sound.amr文件,這就是剛剛錄制的音頻文件-----Android模擬器將會直接使用宿主電腦上的麥克風,一次如果讀者的電腦上有麥克風,那么該程序即可正常錄制聲音。
上面的程序需要使用系統的麥克風進行錄音,因此需要向該程序授予錄音的權限沒也就是在AndroidManifest.xml文件中增加如下配置:
<!-- 授予該程序錄制聲音的權限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO"/>