봄날은 갔다. 이제 그 정신으로 공부하자

동영상 앱 빌드 - part3 본문

학습

동영상 앱 빌드 - part3

길재의 그 정신으로 공부하자 2021. 1. 4. 11:01

이번 글에서는 동영상앱을 만드는데 꼭 필요한 구성요소인 MediaController와 MediaSession에 대해 설명합니다.

 

* 참고 사이트:

   https://developer.android.com/guide/topics/media-apps/video-app/building-a-video-app

 

일반 동영상 플레이어는 실행되는 동안 항상 컨트롤과 동영상 콘텐츠를 표시해야 합니다.

백그라운드 or UI없이는 작동할 수 없습니다.

따라서 UI, Player, MediaSession, MediaController가 포함된 단일 활동으로 앱을 빌드하는 것이 좋습니다.

 

동영상 플레이어 Activity 빌드

MediaSession과 MediaController가 포함된 Activity를 빌드하는 방법에 대해 설명합니다.

Activity는 onCreate() lifecycle Callback을 수신하면 아래 단계를 실행해야 합니다.

  • MediaSession을 만들고 초기화 합니다.
  • MediaSession Callback을 설정합니다.
  • Player가 보이지 않을 때 Media Button Event가 플레이어를 다시 시작하지 않도록 MediaSession의 Media Button Receiver를 null로 설정합니다. 

해당 내용은 Android 5.0(API Level 21) 이상의 기기에만 영향을 줍니다.

  • MediaController를 만들고 초기화합니다.

아래 onCreate()함수는 위 설명한 처리에 대한 예시 입니다.

private latent var mediaSession: MediaSessionCompat

public override fun onCreate(saveInstanceState: Bundle?){
    super.onCreate(savedInstanceSatate)

    // Create a MediaSessonCompat
    mediaSession = MediaSessionCompat(this, TAG).apply{
        // Enable callbacks from MediaButtons and TransportControls
        setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS or MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS)

        // Do not let MediaButtons restart the player when the app is not visible
        setMediaButtonReceiver(null)

        // Set an initial PlaybackState with ACTION_PLAY, so media buttons can start the player
        val stateBuilder = PlaybackStateCompat.Builder().setActions(PlaybackStateCompat.ACTION_PLAY or PlaybackStateCompat.ACTION_PLAY_PAUSE)
        setPlaybackState(stateBuilder.build())

        // MySessionCallback has methods that handle callbacks from a media controller
        setCallback(MySessionCallback())
    }

    // Create a MediaControllerCompat
    MediaControllerCompat(this, mediaSession).also { mediaController ->
        MediaControllerCompat.setMediaController(this, mediaController)
    }
}

 

앱이 종료되거나 bockground로 가게되면 Activity는 onPause()와 onStop() 콜벡을 연속으로 수신합니다. 플레이어가 재생 중인 경우, Activity가 사라지기 전에 플레이어를 중지해야 합니다. 

어떤 콜백을 사용할지는 실행 중인 Android 버전에 따라 다릅니다.

Android 6.0(API Level 23)이하에서는 onStop()의 호출 시점이 보장되지 않습니다. Activity가 사라지고 5sec 후에 호출될 수도 있습니다. 따라서 Android 버전 7.0이전에서는 앱이 onPause()에서 재생을 중지해야 합니다.

 

즉, 아래와 같이 Android 버전에 따라 플레이어 중지 시점을 다르게 처리해야 합니다.

  • Android 버전 6.0 이하: onPause()에서 플레이어를 중지
  • Android 버전 7.0 이상: onStop()에서 플레이어를 중지
  • 버전에 상관 없이 onDestory()에서 플레이어 해제 및 정리

 

MediaSession Callback

미디어 세션 콜백 메서드가 미디어 세션 및 기타 앱 구성 요소(예: Alarm, Broadcast Receiver)를 관리하는 방법에 대해 설명합니다.

동영상 앱은 MediaSession과 MediaController를 동일한 Activity에서 실행하므로 서비스 호출이 없으며 NotificationManager를 통해 알림이 처리됩니다. 

아래 표는 각 콜백 메서드에서 다양한 기능이 제어되는 방식을 보여줍니다.

구분

onPlay()

onPause()

onStop()

Audio Focus

OnAudioFocusChangeListener에서 requestFocus() 전달됨.

항상 requestFocus() 먼저 호출하고 포커스가 허용된 경우에만 진행.

 

abandonAudioFocus()

Media Session

setActive(true)

- 메타데이터 및 상태 업데이트

- 메타데이터 상태 업데이트

setActive(false)

- 메타데이터 및 상태 업데이트

Player Implementation

플레이어 시작

플레이어 일시 중지

플레이어 중지

Becoming Noise

BroadcastReceiver 등록

BroadcastReceiver 등록 취소

 

Notifications

알림 표시

알림 업데이트

 

 

Comments