Aggiungere controlli di riproduzione all'app

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

Kotlin

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

trendy

implementation "androidx.media3:media3-ui:1.3.1"

Il componente più importante è PlayerView, una visualizzazione per le riproduzioni di contenuti multimediali. In PlayerView vengono visualizzati video, sottotitoli e copertine degli album durante la riproduzione, oltre ai controlli di riproduzione.

PlayerView offre un metodo setPlayer per collegare e scollegare (superando null) le istanze del player.

Visualizzazione player

PlayerView può essere utilizzato per la riproduzione sia di video sia di audio. Esegue il rendering del video e dei sottotitoli in caso di riproduzione del video e può mostrare gli artwork inclusi come metadati nei file audio. Puoi includerlo nei file di layout come qualsiasi altro componente dell'interfaccia utente. Ad esempio, è possibile includere PlayerView con il 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 sopra riportato mostra che PlayerView fornisce diversi attributi. Questi attributi possono essere utilizzati per personalizzare il comportamento e l'aspetto della vista. La maggior parte di questi attributi ha metodi di setter corrispondenti, che possono essere utilizzati per personalizzare la vista in fase di runtime. Il Javadoc di PlayerView elenca questi attributi e metodi setter in modo più dettagliato.

Una volta dichiarata la vista nel file di layout, puoi cercarla nel metodo onCreate dell'attività:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  // ...
  playerView = findViewById(R.id.player_view)
}

Java

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

Dopo aver inizializzato un player, puoi collegarlo alla visualizzazione chiamando setPlayer:

Kotlin

// 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()

Java

// 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 dei video. Oltre ai valori spherical_gl_surface_view (che rappresenta un valore speciale per la riproduzione di video sferici) e video_decoder_gl_surface_view (per il rendering video che utilizza i responsabili del rendering delle estensioni), i valori consentiti sono surface_view, texture_view e none. Se la visualizzazione riguarda solo la riproduzione audio, usare none per evitare di creare una piattaforma, poiché questa operazione può essere costosa.

Se la visualizzazione riguarda la riproduzione di video standard, è necessario utilizzare surface_view o texture_view. SurfaceView offre una serie di vantaggi rispetto a TextureView per la riproduzione dei video:

  • Consumo energetico notevolmente ridotto su molti dispositivi.
  • Tempi di fotogramma più precisi, per una riproduzione dei video più fluida.
  • Supporto di output video HDR di qualità superiore su dispositivi idonei.
  • Supporto per l'output sicuro durante la riproduzione di contenuti protetti da DRM.
  • La possibilità di visualizzare contenuti video alla massima risoluzione del display sui dispositivi Android TV che fanno lo scale up del livello UI.

Di conseguenza, se possibile, SurfaceView deve essere preferito rispetto a TextureView. TextureView deve essere utilizzato solo se SurfaceView non soddisfa le tue esigenze. Ad esempio, prima di Android 7.0 (livello API 24) sono necessari animazioni o scorrimento fluido della superficie video, come descritto nelle note che seguono. Per questo caso, è preferibile utilizzare TextureView solo quando SDK_INT è inferiore a 24 (Android 7.0) e SurfaceView negli altri casi.

Navigazione con D-pad su Android TV

Il telecomando di Android TV è dotato di un controllo D-pad che invia comandi che vengono inviati come eventi chiave alle ore dispatchKeyEvent(KeyEvent) del tuo Activity. Questi elementi devono essere delegati alla visualizzazione del player:

Kotlin

override fun dispatchKeyEvent(event: KeyEvent?): Boolean{
  return playerView.dispatchKeyEvent(event!!) || super.dispatchKeyEvent(event)
}

Java

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
  return playerView.dispatchKeyEvent(event) || super.dispatchKeyEvent(event);
}

La richiesta di stato attivo per la visualizzazione del player è importante per navigare nei controlli di riproduzione e saltare gli annunci. Valuta la possibilità di richiedere l'attenzione in onCreate delle Activity:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  // ...
  playerView.requestFocus()
  // ...
}

Java

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // ...
    playerView.requestFocus();
    // ...
}

Se utilizzi Scrivi su Android TV, devi rendere AndroidView attivabile e delegare l'evento passando il parametro di modifica a AndroidView di conseguenza:

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

Esegui override elementi disegnabili

PlayerView usa PlayerControlView per visualizzare i controlli di riproduzione e la barra di avanzamento. Gli elementi disegnabili utilizzati da PlayerControlView possono essere sostituiti con gli stessi nomi definiti nell'applicazione. Consulta il Javadoc di PlayerControlView per un elenco dei disegni di controllo che possono essere sostituiti.

Ulteriore personalizzazione

Ove sia richiesta una personalizzazione oltre a quella descritta sopra, ci aspettiamo che gli sviluppatori di app implementino i propri componenti dell'interfaccia utente anziché utilizzare quelli forniti dal modulo UI di Media3.