동영상 플레이어 활동 빌드

활동은 onCreate() 수명 주기 콜백 메서드를 수신하면 다음 단계를 실행해야 합니다.

  • 미디어 세션을 만들고 초기화합니다.
  • 미디어 세션 콜백을 설정합니다.
  • 플레이어가 보이지 않을 때 미디어 버튼 이벤트가 플레이어를 다시 시작하지 않도록 미디어 세션의 미디어 버튼 수신기를 null로 설정합니다. Android 5.0(API 레벨 21) 이상의 기기에만 영향을 줍니다.
  • 미디어 컨트롤러를 만들고 초기화합니다.

다음 onCreate() 코드는 이러한 단계를 보여줍니다.

Kotlin

private lateinit var mediaSession: MediaSessionCompat

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

    // Create a MediaSessionCompat
    mediaSession = MediaSessionCompat(this, LOG_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)
    }
}

Java

MediaSessionCompat mediaSession;
PlaybackStateCompat.Builder stateBuilder;

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  // Create a MediaSessionCompat
  mediaSession = new MediaSessionCompat(this, LOG_TAG);

  // Enable callbacks from MediaButtons and TransportControls
  mediaSession.setFlags(
    MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS |
    MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);

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

  // Set an initial PlaybackState with ACTION_PLAY, so media buttons can start the player
  stateBuilder = new PlaybackStateCompat.Builder()
                .setActions(
                    PlaybackStateCompat.ACTION_PLAY |
                    PlaybackStateCompat.ACTION_PLAY_PAUSE);
  mediaSession.setState(stateBuilder.build());

  // MySessionCallback has methods that handle callbacks from a media controller
  mediaSession.setCallback(new MySessionCallback());

  // Create a MediaControllerCompat
  MediaControllerCompat mediaController =
    new MediaControllerCompat(this, mediaSession);

  MediaControllerCompat.setMediaController(this, mediaController);
}

앱이 닫히면 활동은 onPause()onStop() 콜백을 연속으로 수신합니다. 플레이어가 재생 중인 경우 활동이 사라지기 전에 플레이어를 중지해야 합니다. 어떤 콜백을 사용할지는 실행 중인 Android 버전에 따라 다릅니다.

Android 6.0(API 레벨 23) 이하에서는 onStop()의 호출 시점이 보장되지 않습니다. 활동이 사라지고 5초 후에 호출될 수 있습니다. 따라서 Android 버전 7.0 이전에서는 앱이 onPause()에서 재생을 중지해야 합니다. Android 7.0 이상에서는 활동이 표시되지 않는 즉시 시스템에서 onStop()을 호출하므로 문제가 되지 않습니다.

요약:

  • Android 버전 6.0 이하에서는 onPause() 콜백에서 플레이어를 중지합니다.
  • Android 버전 7.0 이상에서는 onStop() 콜백에서 플레이어를 중지합니다.

활동은 onDestroy() 콜백을 수신하면 플레이어를 해제 및 정리해야 합니다.