Aggiungere controlli di riproduzione all'app

Un'app che riproduce contenuti multimediali richiede componenti dell'interfaccia utente per la visualizzazione di contenuti multimediali e il controllo della riproduzione. La libreria Media3 include un modulo UI che contiene diversi componenti dell'interfaccia utente. Per dipendere dal modulo UI, aggiungi la seguente dipendenza:

implementation("androidx.media3:media3-ui:1.5.1")
implementation "androidx.media3:media3-ui:1.5.1"

Il componente più importante è PlayerView, una visualizzazione per le riproduzioni di contenuti multimediali. PlayerView mostra video, immagini, sottotitoli e copertine durante la riproduzione, nonché i controlli di riproduzione.

PlayerView utilizza un metodo setPlayer per il collegamento e lo scollegamento (tramite di null) istanze player.

Visualizzazione player

PlayerView può essere utilizzato sia per la riproduzione di video, immagini e audio. Esegue il rendering di video e sottotitoli nel caso della riproduzione di video, bitmap per la riproduzione di immagini e può mostrare l'artwork incluso come metadati nei file audio. Puoi includerlo nei file di layout, come qualsiasi altro componente della UI. Ad esempio, un PlayerView può essere incluso nel seguente XML:

<androidx.media3.ui.PlayerView
    android:id="@+id/player_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:show_buffering="when_playing"
    app:show_shuffle_button="true"/>

Lo snippet riportato sopra indica che PlayerView fornisce diversi attributi. Questi attributi possono essere usati per personalizzare il comportamento della vista, nonché il suo aspetto. La maggior parte di questi attributi ha un setter corrispondente utilizzabili per personalizzare la visualizzazione in fase di runtime. La PlayerView Il codice Javadoc elenca questi attributi e metodi di impostazione in in modo più dettagliato.

Una volta dichiarata nel file di layout, la visualizzazione può essere cercata nel metodo onCreate dell'attività:

KotlinJava
override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  // ...
  playerView = findViewById(R.id.player_view)
}
@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  // ...
  playerView = findViewById(R.id.player_view);
}

Una volta inizializzato, un player può essere collegato alla vista richiamando setPlayer:

KotlinJava
// Instantiate the player.
val player = ExoPlayer.Builder(context).build()
// Attach player to the view.
playerView.player = player
// Set the media item to be played.
player.setMediaItem(mediaItem)
// Prepare the player.
player.prepare()
// Instantiate the player.
player = new ExoPlayer.Builder(context).build();
// Attach player to the view.
playerView.setPlayer(player);
// Set the media item to be played.
player.setMediaItem(mediaItem);
// Prepare the player.
player.prepare();

Scegli un tipo di superficie

L'attributo surface_type di PlayerView ti consente di impostare il tipo di superficie utilizzata per la riproduzione video. Oltre ai valori spherical_gl_surface_view (che è un valore speciale per la riproduzione di video sferici) e video_decoder_gl_surface_view (per il rendering video con estensione renderer), i valori consentiti sono surface_view, texture_view e none. Se la visualizzazione riguarda solo la riproduzione audio, usa none per evitare di dover creare una superficie perché questo può essere costoso.

Se la visualizzazione è per la riproduzione di video normali, deve essere utilizzata surface_view o texture_view. SurfaceView offre una serie di vantaggi oltre TextureView per riproduzione video:

  • Riduzione significativa del consumo di energia su molti dispositivi.
  • Tempi dei fotogrammi più precisi, per una riproduzione video più fluida.
  • Supporto per l'output video HDR di qualità superiore sui dispositivi idonei.
  • Supporto per l'output sicuro durante la riproduzione di contenuti protetti da DRM.
  • La possibilità di visualizzare i contenuti video alla massima risoluzione del display su dispositivi Android TV che eseguono l'upscaling del livello dell'interfaccia utente.

Pertanto, se possibile, è preferibile preferire SurfaceView rispetto a TextureView. TextureView deve essere utilizzato solo se SurfaceView non soddisfa le tue esigenze. Uno. ad esempio quando è necessario scorrere la superficie video con animazioni fluide precedenti ad Android 7.0 (livello API 24), come descritto nelle note che seguono. Per questo caso, è preferibile utilizzare TextureView solo quando SDK_INT è inferiore a 24 (Android 7.0) e SurfaceView in caso contrario.

Navigazione con D-pad su Android TV

Il telecomando di Android TV dispone di un D-pad che invia comandi arriva come evento chiave presso dispatchKeyEvent(KeyEvent) di Activity. Questi devono essere delegati alla vista player:

KotlinJava
override fun dispatchKeyEvent(event: KeyEvent?): Boolean{
  return playerView.dispatchKeyEvent(event!!) || super.dispatchKeyEvent(event)
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
  return playerView.dispatchKeyEvent(event) || super.dispatchKeyEvent(event);
}

La richiesta di attivazione della visualizzazione del player è importante per navigare tra i controlli di riproduzione e saltare gli annunci. Considera la possibilità di richiedere l'attenzione in onCreate delle Activity:

KotlinJava
override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  // ...
  playerView.requestFocus()
  // ...
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // ...
    playerView.requestFocus();
    // ...
}

Se utilizzi Compose su Android TV, devi rendere AndroidView selezionabile e delegare l'evento passando il parametro del modificatore a AndroidView di conseguenza:

AndroidView(
  modifier = modifier
    .focusable()
    .onKeyEvent { playerView.dispatchKeyEvent(it.nativeKeyEvent) },
  factory = { playerView }
)

Sostituisci drawable

PlayerView utilizza PlayerControlView per visualizzare la riproduzione controlli e barra di avanzamento. Gli elementi drawable utilizzati da PlayerControlView possono essere sostituiti da elementi drawable con gli stessi nomi definiti nell'applicazione. Consulta: il Javadoc di PlayerControlView per un elenco di drawable di controllo che possono essere sostituite.

Ulteriore personalizzazione

Laddove sia richiesta una personalizzazione diversa da quella descritta sopra, ci aspettiamo che l'app gli sviluppatori implementeranno i propri componenti dell'interfaccia utente anziché utilizzare quelli forniti dal modulo UI di Media3.