MediaPlayer 클래스는 최소한의 설정으로 동영상과 오디오를 디코딩하여 재생할 수 있게 해준다.
상태
MediaPlayer의 상태 다이어그램은 다음과 같다
- MediaPlayer가 내부적으로 가지고 있는 상태이며 각 상태에 따라 가능한 동작이 다르다.
- 기본적으로는 아래 시퀀스대로 동작한다
- 생성시 IDLE 상태
- setDataSource로 Initialized상태로 변경
- 플레이어 준비를 위한 prepare/prepareAsync 동작이 끝나면 Prepared 상태
- 이상태부터 seekTo, start등의 제어동작을 할 수있다.
- start() 호출하여 Started상태가 되며, pause/seekTo/stop/start등이 가능
- pause() 호출해 Paused상태.
- stop()을 호출하거나 재생이 끝나서 PlaybackCompleted상태에서 looping이 false일경우 Stopped상태로 전이.
- 이상태에서는 start할 수 없고, prepare/prepareAsync를 통해 Prepared 상태로 돌아가거나 release()호출로 자원을 반납하고 end 상태로 전환할 수 있음
특징
- prepareAsync
- prepare 과정은 오래걸리는 과정이다. 컨텐츠을 디코딩할 수 있는 코덱을 찾는등의 동작이 필요하기 때문에 메인스레드에서 호출하면 ANR이 발생할 가능성이 있다
- prepareAsync 와 OnPreparedListener를 통해 비동기적으로 prepare과정을 동작하고 결과를 수신 받을 수 있다.
- 음악을 재생하는 경우에 대해 MediaPlayer를 백그라운드(서비스)에서 실행시켜야 할 수도 있다.
- MediaBrowserServiceCompat객체를 이용해 서비스에서 미디어플레이어를 동작하고 사용자는 재생과는 별도로 포그라운드에서 상호작용 할 수 있다.
- 서비스 또한 기본 동작은 메인스레드임을 명심하자. prepareAsync가 권장된다.
- 서비스에서 컨텐츠를 재생하는 경우에 기기 상태에 따라 절전모드에 진입할 수 있으므로, MediaPlayer의 setWakeLock을 통해 절전모드에 대비해야 한다.
- notification을 등록해 서비스를 setForeground로 지정해 주어야 한다.