MediaRecorder的狀態
MediaRecorder的錄音過程
首先:frameworks/base/media/java/android/media/MediaRecorder.java
publicnative void start() throws IllegalStateException;
接着到JNI:
frameworks/base/media/jni/android_media_MediaRecorder.cpp
340android_media_MediaRecorder_start(JNIEnv *env, jobject thiz)
341{
342 //LOGV("start");
343 sp<MediaRecorder> mr = getMediaRecorder(env, thiz);
344 process_media_recorder_call(env, mr->start(),"java/lang/RuntimeException", "start failed.");
345}
接着到libmedia中:
frameworks/base/media/libmedia/mediarecorder.cpp
調用tatus_tret = mMediaRecorder->start(); 其中mMediaRecorder爲IMediaRecorder.cpp
備註:
classIMediaRecorder: public Iinterface
classBnMediaRecorder: public BnInterface<IMediaRecorder>
classMediaRecorderClient : public BnMediaRecorder
接着到IMediaRecorder.cpp中:
./libmedia/IMediaRecorder.cpp
221 status_t start()
222 {
223 LOGV("start");
224 Parcel data, reply;
225 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
226 remote()->transact(START, data, &reply);
227 return reply.readInt32();
228 }
接着到frameworks/base/media/libmediaplayerservice/MediaRecorderClient.cpp
222status_t MediaRecorderClient::start()
223{
224 LOGV("start");
225 Mutex::Autolock lock(mLock);
226 if (mRecorder == NULL) {
227 LOGE("recorder is not initialized");
228 return NO_INIT;
229 }
230 return mRecorder->start();
231
232}
備註:MediaRecorderBase *mRecorder;
structStagefrightRecorder : public MediaRecorderBase
接着到frameworks/base/media/libmediaplayerservice/StagefrightRecorder.cpp
146status_t StagefrightRecorder::start() {
147 if (mWriter != NULL) {
148 return UNKNOWN_ERROR;
149 }
150
151 switch (mOutputFormat) {
152 case OUTPUT_FORMAT_DEFAULT:
153 case OUTPUT_FORMAT_THREE_GPP:
154 case OUTPUT_FORMAT_MPEG_4:
155 return startMPEG4Recording();
156
157 case OUTPUT_FORMAT_AMR_NB:
158 case OUTPUT_FORMAT_AMR_WB:
159 return startAMRRecording();
160
161 default:
162 return UNKNOWN_ERROR;
163 }
164}
MediaPlayer的播放過程
首先:
frameworks/base/media/java/android/media/MediaPlayer.java
部分代碼:
796 public void start() throws IllegalStateException {
797 stayAwake(true);
798 _start();
799 }
privatenative void _start() throws IllegalStateException;
接着到:frameworks/base/media/jni/android_media_MediaPlayer.cpp
348android_media_MediaPlayer_start(JNIEnv *env, jobject thiz)
349{
350 //LOGV("start");
351 sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
352 if (mp == NULL ) {
353 jniThrowException(env, "java/lang/IllegalStateException",NULL);
354 return;
355 }
356 process_media_player_call( env, thiz, mp->start(), NULL, NULL);
357}
接着到:frameworks/base/media/libmedia/mediaplayer.cpp
262status_t MediaPlayer::start()
263{
264 LOGV("start");
265 Mutex::Autolock _l(mLock);
266 if (mCurrentState & MEDIA_PLAYER_STARTED)
267 return NO_ERROR;
268 if ( (mPlayer != 0) && ( mCurrentState & (MEDIA_PLAYER_PREPARED |
269 MEDIA_PLAYER_PLAYBACK_COMPLETE |MEDIA_PLAYER_PAUSED ) ) ) {
270 mPlayer->setLooping(mLoop);
271 mPlayer->setVolume(mLeftVolume, mRightVolume);
272 mCurrentState = MEDIA_PLAYER_STARTED;
273 status_t ret =mPlayer->start();
274 if (ret != NO_ERROR) {
275 mCurrentState = MEDIA_PLAYER_STATE_ERROR;
276 } else {
277 if (mCurrentState == MEDIA_PLAYER_PLAYBACK_COMPLETE) {
278 LOGV("playback completed immediately followingstart()");
279 }
280 }
281 return ret;
282 }
283 LOGE("start called in state %d", mCurrentState);
284 return INVALID_OPERATION;
285}
286
備註:sp<IMediaPlayer> mPlayer;
classBnMediaPlayer: public BnInterface<IMediaPlayer>
classClient : public BnMediaPlayer
接着:frameworks/base/media/libmediaplayerservice/MediaPlayerService.cpp
1094status_t MediaPlayerService::Client::start()
1095{
1096 LOGV("[%d] start", mConnId);
1097 sp<MediaPlayerBase> p = getPlayer();
1098 if (p == 0) return UNKNOWN_ERROR;
1099 p->setLooping(mLoop);
1100 return p->start();
1101}
備註:
classMediaPlayerBase : public RefBase
classMediaPlayerInterface : public MediaPlayerBase
classPVPlayer : public MediaPlayerInterface
classOMXPlayer : public MediaPlayerInterface
1.首先,錄音機操作需要相關權限,比如:
<uses-permissionandroid:name="android.permission.RECORD_AUDIO"/>
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2.錄音機開始錄音
如下:判斷擴展卡狀態,重要類Environment
publicstaticbooleanexternalStorageExist() {
StringgetExternalStorageState = Environment.getExternalStorageState();
if(getExternalStorageState.equals(Environment.MEDIA_MOUNTED)){
returntrue;
}
returnfalse;
}