用android 7.0版本的录音应用为例进行跟进下。
STEP 1:
\packages\apps\SoundRecorder\src\com\android\soundrecorder\SoundRecorder.java
public void onCreate(Bundle icycle) {
super.onCreate(icycle);
Intent i = getIntent();
if (i != null) {
String s = i.getType();
if (AUDIO_AMR.equals(s) || AUDIO_3GPP.equals(s) || AUDIO_ANY.equals(s)
|| ANY_ANY.equals(s)) {
mRequestedType = s;
} else if (s != null) {
// we only support amr and 3gppformats right now
setResult(RESULT_CANCELED);
finish();
return;
}
final String EXTRA_MAX_BYTES
=android.provider.MediaStore.Audio.Media.EXTRA_MAX_BYTES;
mMaxFileSize = i.getLongExtra(EXTRA_MAX_BYTES, -1);
}
if (AUDIO_ANY.equals(mRequestedType) || ANY_ANY.equals(mRequestedType)){
mRequestedType = AUDIO_3GPP;
}
setContentView(R.layout.main);
mRecorder= new Recorder();
mRecorder.setOnStateChangedListener(this);
mRemainingTimeCalculator = new RemainingTimeCalculator();
PowerManager pm
= (PowerManager) getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK,
"SoundRecorder");
initResourceRefs();
setResult(RESULT_CANCELED);
registerExternalStorageListener();
if (icycle != null) {
Bundle recorderState = icycle.getBundle(RECORDER_STATE_KEY);
if (recorderState != null) {
mRecorder.restoreState(recorderState);
mSampleInterrupted =recorderState.getBoolean(SAMPLE_INTERRUPTED_KEY, false);
mMaxFileSize =recorderState.getLong(MAX_FILE_SIZE_KEY, -1);
}
}
updateUi();
}
/*
* Handle the buttons.
*/
public void onClick(View button) {
if (!button.isEnabled())
return;
switch (button.getId()) {
case R.id.recordButton:
mRemainingTimeCalculator.reset();
if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
mSampleInterrupted = true;
mErrorUiMessage =getResources().getString(R.string.insert_sd_card);
updateUi();
} else if(!mRemainingTimeCalculator.diskSpaceAvailable()) {
mSampleInterrupted = true;
mErrorUiMessage =getResources().getString(R.string.storage_is_full);
updateUi();
} else {
stopAudioPlayback();
if(AUDIO_AMR.equals(mRequestedType)) {
mRemainingTimeCalculator.setBitRate(BITRATE_AMR);
mRecorder.startRecording(MediaRecorder.OutputFormat.AMR_NB,".amr", this);
} else if(AUDIO_3GPP.equals(mRequestedType)) {
mRemainingTimeCalculator.setBitRate(BITRATE_3GPP);
mRecorder.startRecording(MediaRecorder.OutputFormat.THREE_GPP,".3gpp",
this);
} else {
throw newIllegalArgumentException("Invalid output file type requested");
}
if (mMaxFileSize != -1) {
mRemainingTimeCalculator.setFileSizeLimit(
mRecorder.sampleFile(), mMaxFileSize);
}
}
break;
case R.id.playButton:
mRecorder.startPlayback();
break;
case R.id.stopButton:
mRecorder.stop();
break;
case R.id.acceptButton:
mRecorder.stop();
saveSample();
finish();
break;
case R.id.discardButton:
mRecorder.delete();
&