一.Recorder類介紹
Recorder類負責SoundRecorder的全部功能方面的實現,它包含一個MediaRecorder成員和一個MediaPlayer成員,並封裝了這兩個成員的相關操作。該類向SoundRecorder類提供一系列的介面來控制錄音和播放錄音的過程。下面介紹一下其中重要的成員和方法。
成員:
五種狀態:
public static final int IDLE_STATE = 0;//停止
public static final int RECORDING_STATE = 1;//錄音
public static final int PLAYING_STATE = 2; //播放錄音
public static final int IDLE_HOLD_STATE = 3; //停止但持有一個錄音檔案
public static final int PLAYING_PAUSE_STATE = 4;//播放暫停
儲存路徑:
private static final String SDCARD_PATH =
Environment.getExternalStorageDirectory().getAbsolutePath()
+ MediaStore.RECORDER_PATH_SDCARD;
private static final String LOCAL_PATH =
Environment.getDataDirectory().getAbsolutePath()
+ MediaStore.RECORDER_PATH_PHONE;
錄音器和播放器:
MediaRecorder mRecorder = null;
MediaPlayer mPlayer = null;
方法:
對狀態的操作方法:
state(); setState();\\讀取狀態和設定狀態
saveState(); restoreState();\\負責儲存和讀取儲存路徑
sampleLength(); sampleFile();getSampleFileUri(); 返回相應的成員
setSampleFileUri(); \\設定檔案路徑
setSaveInSDCard();\\儲存到SD卡
setSaveInLocal();\\儲存到手機
delete();\\刪除錄音檔案,更新狀態。
clear();\\錄音檔案儲存,可以進行下一次錄音。
getCurrentStorage()\\擷取當前檔案路徑
setSample()\\設定持有的錄音檔案的儲存路徑和長度
主要功能函數:
startRecording():啟動錄音,包括:
1.設定錄音檔案路徑
2.構造錄音檔案名稱
3.構造並初始化錄音檔案
4.構造並設定mRecorder,包括設定聲源、輸出檔案格式、輸出檔案路徑、編碼方式等。
5.啟動mRecorder開始錄音, 將Recorder的狀態設定為RECORDING_STATE。
stopRecording():停止錄音,包括:
1. 停止mRecorder,釋放資源。
2. 將Recorder狀態設為IDLE_HOLD_STATE。
startPlayback():開始播放持有的錄音檔案。狀態設為PLAYING_STATE。
stopPlayback():停止播放。狀態設為IDLE_HOLD_STATE。
stop():停止mRecorder和mPlayer。狀態設為IDLE_HOLD_STATE。
pausePlay():暫停播放,儲存暫停位置。狀態設為PLAYING_PAUSE_STATE。
continuePlay():繼續播放。狀態設為PLAYING_STATE。
總體上來說,Recorder類總是處於這五個狀態,通過調用各個方法使得Recorder在各個狀態之間跳轉,如(虛線框部分在SoundRecorder類中實現):
對於Recorder類來說,實際上的錄音實現都是通過調用mRecorder的方法來實現的,例如在startRecording()中,有如下代碼:
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(outputfileformat);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setOutputFile(mSampleFile.getAbsolutePath());
mRecorder.prepare();
mRecorder.start();
Recorder本身只是將MediaRecorder類封裝,提供介面給SoundRecorder類。SoundRecorder類負責實現所有對使用者呈現的部分,其本身就是一個Activity。兩者的關係如所示
二.SoundRecorder類介紹
先介紹RemainingTimeCalculator類。它負責計算儲存介質剩餘空間能夠存放多長的錄音檔案。其中的timeRemaining()函數負責計算剩餘時間,取檔案大小限制和空間大小限制的較小的一個來計算剩餘時間。
mCurrentLowerLimit = result < result2
? DISK_SPACE_LIMIT : FILE_SIZE_LIMIT;
SoundRecorder類本身是一個Activity。該類負責實現一切向使用者顯示的部分:包括介面,對各種操作的響應。錄音、儲存錄音、播放錄音等功能通過調用Recorder類中的方法實現。在SoundRecorder中包含一個Recorder類的對象mRecorder。
作為Activity類的子類,SoundRecorder重載了父類的多個函數:
onCreate() onDestroy()(從啟動到完全銷毀)
onStart() onStop()(從可視到不可視)
onPause() (從可操作到不可操作)
這幾個函數包含Activity在不同狀態間切換時需要的操作。這裡指的狀態切換是因為SoundRecorder程式之外的影響,如手機休眠、程式掛起、從SoundRecorder程式切換到其他程式等。
此外SoundRecorder還重載了幾個函數:
onConfigurationChanged();橫豎屏切換時,重新整理UI介面。
onSaveInstanceState(Bundle outState);將Recorder的狀態儲存到Bundle,實際調用的是上面提到的saveState()函數。當SoundRecorder因為某些原因需要中斷時,狀態被儲存,然後在重啟時由onCreate()中的相應代碼讀取Bundle中的狀態值,回複中斷前程式的狀態,實際調用的是上面提到的restoreState()函數。
onPrepareOptionsMenu()、onOptionsItemSelected(),這兩個函數負責實現menu鍵功能。