안드로이드 멀티미디어 프레임워크는 다양한 일반 미디어 유형의 재생을 지원하므로 오디오, 동영상, 이미지를 애플리케이션에 쉽게 통합할 수 있다.

안드로이드에서 MediaPlayer를 사용하면 오디오 또는 동영상을 재생할 수 있다.

기본사항

MediaPlayer : 이 클래스는 사운드 및 동영상을 재생하는 기본 API
AudioManager : 이 클래스는 기기의 오디오 소스 및 오디오 출력을 관리

manifest 선언

MediaPlayer를 사용하여 애플리케이션 개발을 시작하기 전에 manifest에 적절한 선언이 있어야 하는지 확인해야 한다.

  • 인터넷 권한 : MediaPlayer를 사용하여 네트워크 기반 콘텐츠를 스트리밍할 경우
    <uses-permission android:name="android.permission.INTERNET"/>
  • Wake Lock권한 : 플레이어 애플리케이션 화면이 어두워지는 것이나 프로세서의 절전 모드를 방지해야 하는 경우 MediaPlayer.setScreenOnWhilePlaying()이나MediaPlayer.setWakeMode() 메서드를 사용한다면 이 권한을 요청
    <uses-permission android:name="android.permission.WAKE_LOCK"/>

MediaPlayer 사용법

mediaPlayer에서는 여러 가지 미디어 소스를 지원한다.

  • 로컬 리소스
  • ContentResolver에서 가져올 수 있는 것과 같은 내부 URI
  • 외부 URL (스트리밍)
  1. 애플리케이션의 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
  2. 시스템에서 로컬로 사용 가능한 URI에서 재생할 수 있는 방법
    val myUri: Uri = .... // initialize Uri here
       val mediaPlayer: MediaPlayer? = MediaPlayer().apply {
           setAudioStreamType(AudioManager.STREAM_MUSIC)
           setDataSource(applicationContext, myUri)
           prepare()
           start()
       }
  3. HTTP 스트리밍을 통해 원격 URL에서 재생하는 방법
    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 해제

MediaPlayer가 시스템 리소스를 낭비할 수 있으니 작업이 끝나면 항상 release()를 호출하여 할당된 시스템 리소스를 해제해야 한다.

    mediaPlayer?.release()
    mediaPlayer = null

Service에서 MediaPlayer 사용

애플리케이션이 화면에 없는 경우에도 백그라운드에서 미디어가 재생되게 하려면 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()
        }
    }

0개의 댓글