總網頁瀏覽量

關於我自己

我的相片
人生的必修課是接受無常,人生的選修課是放下執著。

2012年2月13日 星期一

MediaRecorder & MediaPlayer ~ 個人錄音(三)







Implement 「Record」function

PersonRecordActivity.java
// 給一個布林值sdCardExit判別SD card是否存在
boolean sdCardExit = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
// 自動抓當前的系統時間, 格式自訂為yyyy.MM.dd_HH.mm.ss
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy.MM.dd_HH.mm.ss");
// 錄音狀態以1來表示
static final int RECORDING_STATE = 1;
// 錄音檔名的部份命名
final String SAMPLE_PREFIX = "PersonRecord_";
// 此值紀錄record的起始時間
long recordingStart =0;
MediaRecorder mRecorder = null;

public void onClick(View ImageButton) {
    switch (ImageButton.getId()) {
        // 當user按下record按鈕
        case R.id.ib_record:
            // 若SD card存在則執行以下動作
            if (sdCardExit) {
                // 先將狀態設為錄音中
                int mState = RECORDING_STATE;
                // 若正在播放檔案, 則先停止它
                stopAudioPlayback();
                // 開始錄音
                startRecording(MediaRecorder.OutputFormat.THREE_GPP, ".3gp", this);
                // 更新各ImageButton的圖示
                updateUi();
            } else {
                // 若SD card不存在則show toast提醒user
                Toast.makeText(context, "SD Card not exist", Toast.LENGTH_SHORT).show();
            }
            break;
    .
    .
    .
    }
}

private void stopAudioPlayback() {
  Intent i = new Intent("com.android.music.musicservicecommand");
  i.putExtra("command", "pause");

  sendBroadcast(i);
 }

public void startRecording(int outputfileformat, String extension, Context context) {
    stop();
    try {
        File sampleDir = new File(PersonRecordActivity.SAVE_PATH);
        File recordingFile = new File(sampleDir + java.io.File.separator
        + SAMPLE_PREFIX + sdf.format(new java.util.Date())
        + extension);
    } catch (Exception e) {

    return;
}

    mRecorder = new MediaRecorder();
    // 呼叫setAudioSource 指定錄音來源為麥克風錄音
    mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    // 呼叫setOutputFormat設定錄音檔案的輸出格式
    mRecorder.setOutputFormat(outputfileformat);
    // 呼叫MediaRecorder 的setAudioEncoder設定錄音的編碼方式
    mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    // 呼叫setOutputFile 設定錄音檔案的存放位置
    mRecorder.setOutputFile(recordingFile.getAbsolutePath());

    try {
        // 呼叫prepare 準備錄音
        mRecorder.prepare();
        // 呼叫start開始錄音
        mRecorder.start();
    } catch (IOException exception) {
        // 呼叫reset可以重複使用已經產生的MediaRecorder 物件,但必須回到setAudioSource重新設定
        mRecorder.reset();
        // 呼叫release 會立即釋放MediaRecorder 佔用的資源。之後如果想要再使用MediaRecorder 功能,必須重新建立MediaRecorder 物件實體而無法重複使用已經被釋放的MediaRecorder 物件
        mRecorder.release();
        mRecorder = null;
        return;
    }
    // 給定錄音起始時間為當前系統時間
    recordingStart = System.currentTimeMillis();
  
    setState(RECORDING_STATE);
}

private void setState(int state) {
    mState = state;
}

沒有留言:

張貼留言