안드로이드 멀티미디어 프레임워크는 다양한 일반 미디어 유형의 재생을 지원하므로 오디오, 동영상, 이미지를 애플리케이션에 쉽게 통합할 수 있다.
안드로이드에서 MediaPlayer를 사용하면 오디오 또는 동영상을 재생할 수 있다.
MediaPlayer
: 이 클래스는 사운드 및 동영상을 재생하는 기본 API
AudioManager
: 이 클래스는 기기의 오디오 소스 및 오디오 출력을 관리
MediaPlayer를 사용하여 애플리케이션 개발을 시작하기 전에 manifest에 적절한 선언이 있어야 하는지 확인해야 한다.
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
mediaPlayer
에서는 여러 가지 미디어 소스를 지원한다.
res/raw
디렉터리에 저장된 로컬 원시 리소스로 오디오를 재생하는 경우var mediaPlayer: MediaPlayer? = MediaPlayer.create(context, R.raw.sound_file_1)
mediaPlayer?.start() // no need to call prepare(); create() does that for you
val myUri: Uri = .... // initialize Uri here
val mediaPlayer: MediaPlayer? = MediaPlayer().apply {
setAudioStreamType(AudioManager.STREAM_MUSIC)
setDataSource(applicationContext, myUri)
prepare()
start()
}
val url = "http://........" // your URL here
val mediaPlayer: MediaPlayer? = MediaPlayer().apply {
setAudioStreamType(AudioManager.STREAM_MUSIC)
setDataSource(url)
prepare() // might take long! (for buffering, etc)
start()
}
MediaPlayer
가 시스템 리소스를 낭비할 수 있으니 작업이 끝나면 항상 release()
를 호출하여 할당된 시스템 리소스를 해제해야 한다.
mediaPlayer?.release()
mediaPlayer = null
애플리케이션이 화면에 없는 경우에도 백그라운드에서 미디어가 재생되게 하려면 Service
를 시작하고 Service
에서 MediaPlayer
인스턴스를 제어해야 한다.
예를 들어 기본 스레드에서 MediaPlayer
를 사용하는 경우 준비가 완료되고 재생을 시작할 수 있을 때 알림을 받으려면 prepare()
보다는 prepareAsync()
를 호출하고 MediaPlayer.OnPreparedListener
를 구현해야 한다.
private const val ACTION_PLAY: String = "com.example.action.PLAY"
class MyService: Service(), MediaPlayer.OnPreparedListener {
private var mMediaPlayer: MediaPlayer? = null
override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
...
val action: String = intent.action
when(action) {
ACTION_PLAY -> {
mMediaPlayer = ... // initialize it here
mMediaPlayer?.apply {
setOnPreparedListener(this@MyService)
prepareAsync() // prepare async to not block main thread
}
}
}
...
}
/** Called when MediaPlayer is ready */
override fun onPrepared(mediaPlayer: MediaPlayer) {
mediaPlayer.start()
}
}