Como criar atividade de um player de vídeo

Quando a atividade recebe o método de callback do ciclo de vida de onCreate(), execute estas etapas:

  • Crie e inicialize a sessão de mídia
  • Defina o callback da sessão de mídia
  • Defina o receptor do botão da sessão de mídia como nulo para que um evento do botão de mídia não reinicie o player quando ele não estiver visível. Isso afeta somente dispositivos Android 5.0 (API de nível 21) e versões posteriores.
  • Crie e inicialize o controlador de mídia

O código onCreate() abaixo demonstra essas etapas.

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);
    }
    

Quando um app é fechado, a atividade recebe os callbacks onPause() e onStop() sucessivamente. Se o player estiver em reprodução, você precisará interrompê-lo antes que a atividade desapareça. A escolha do callback depende da versão do Android que você está executando.

No Android 6.0 (API de nível 23) e versões anteriores, não há garantia de quando onStop() será chamado. Ele pode ser chamado cinco segundos após a atividade desaparecer. Portanto, nas versões do Android anteriores à 7.0, o app precisa interromper a reprodução em onPause(). No Android 7.0 e versões posteriores, o sistema chama onStop() assim que a atividade deixa de ficar visível. Portanto, isso não é um problema.

Para resumir:

  • No Android 6.0 e versões anteriores, pare o player no callback onPause().
  • No Android 7.0 e versões posteriores, pare o player no callback onStop().

Quando a atividade recebe o callback onDestroy(), ela precisa liberar e limpar o player.