Un'app che riproduce contenuti multimediali richiede componenti dell'interfaccia utente per visualizzare contenuti multimediali e controllare la riproduzione. La libreria Media3 include un modulo UI che contiene una serie di componenti UI. Per dipendere dal modulo UI, aggiungi la seguente dipendenza:
Kotlin
implementation("androidx.media3:media3-ui:1.3.1")
Alla moda
implementation "androidx.media3:media3-ui:1.3.1"
Il componente più importante è PlayerView
, una visualizzazione per le riproduzioni di contenuti multimediali.
PlayerView
mostra video, sottotitoli e copertine degli album durante la riproduzione, nonché
i controlli di riproduzione.
PlayerView
utilizza un metodo setPlayer
per collegare e scollegare (tramite il passaggio di null
) istanze player.
Visualizzazione player
È possibile utilizzare PlayerView
sia per le riproduzioni video che audio. Esegue il rendering del video e dei sottotitoli nel caso di una riproduzione video 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 valore 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 utilizzati per personalizzare il comportamento della vista, nonché il suo aspetto e design. La maggior parte di questi attributi ha metodi
setter corrispondenti, che possono essere usati per personalizzare la vista in fase di runtime. Il Javadoc per PlayerView
elenca questi attributi e metodi di impostazione in modo più dettagliato.
Una volta dichiarata la visualizzazione 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); }
Una volta inizializzato, un player può essere collegato alla vista richiamando
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 video. Oltre ai valori spherical_gl_surface_view
(che
è un valore speciale per la riproduzione sferica di video) e
video_decoder_gl_surface_view
(per il rendering video usando i rendering
delle estensioni), i valori consentiti sono surface_view
, texture_view
e none
. Se la visualizzazione riguarda solo la riproduzione audio, si deve utilizzare none
per evitare di dover creare una piattaforma perché questa operazione può essere costosa.
Se la visualizzazione riguarda la riproduzione di video normale, utilizza surface_view
o texture_view
. SurfaceView
offre una serie di vantaggi per la riproduzione dei video rispetto a TextureView
:
- Riduzione del consumo energetico notevolmente inferiore su molti dispositivi.
- Tempi dei fotogrammi più precisi, per una riproduzione video più fluida.
- Supporto per output video HDR di qualità superiore su dispositivi idonei.
- Supporto per output sicuro durante la riproduzione di contenuti protetti da DRM.
- La possibilità di eseguire il rendering dei contenuti video alla massima risoluzione del display su dispositivi Android TV che migliorano il livello di UI.
Pertanto, se possibile, è preferibile preferire SurfaceView
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), è necessario creare animazioni fluide o scorrere la superficie video, come descritto nelle note seguenti. In 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 ha un D-pad che invia i comandi
che arrivano come eventi chiave alle dispatchKeyEvent(KeyEvent)
delle tue Activity
. Questi
devono essere delegati alla vista 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); }
Richiedere lo stato attivo per la visualizzazione del player è importante per esplorare i controlli di riproduzione e saltare gli annunci. Valuta la possibilità di richiedere l'attenzione in onCreate
di
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 Compose su Android TV, devi rendere selezionabile AndroidView
e delegare l'evento passando il parametro del modificatore in
AndroidView
di conseguenza:
AndroidView(
modifier = modifier
.focusable()
.onKeyEvent { playerView.dispatchKeyEvent(it.nativeKeyEvent) },
factory = { playerView }
)
Sostituisci drawable
PlayerView
usa PlayerControlView
per mostrare i controlli
di riproduzione e la barra di avanzamento. I drawable utilizzati da PlayerControlView
possono
essere sostituiti da quelli con gli stessi nomi definiti nell'applicazione. Consulta
il Javadoc PlayerControlView
per un elenco dei drawable di controllo
che possono essere sostituiti.
Ulteriore personalizzazione
Laddove sia richiesta una personalizzazione diversa da quella descritta sopra, ci aspettiamo che gli sviluppatori di app implementino i propri componenti UI anziché utilizzare quelli forniti dal modulo UI di Media3.