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 vari componenti dell'interfaccia utente. Per dipendere dal modulo UI aggiungi quanto segue :
Kotlin
implementation("androidx.media3:media3-ui:1.4.1")
Alla moda
implementation "androidx.media3:media3-ui:1.4.1"
Il componente più importante è PlayerView
, una visualizzazione per le riproduzioni di contenuti multimediali.
PlayerView
mostra video, immagini, sottotitoli e copertine degli album 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
L'elemento PlayerView
può essere utilizzato sia per le riproduzioni video, di immagini che audio. Esegue il rendering
video e sottotitoli in caso di riproduzione video, bitmap per la riproduzione di immagini
e può visualizzare gli artwork inclusi come metadati nei file audio. Puoi includerlo
nei file di layout, come per qualsiasi altro componente della UI. Ad esempio, 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 Javadoc elenca questi attributi e metodi di impostazione in
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
utilizzati 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 riguarda la riproduzione video normale, allora surface_view
o texture_view
di destinazione. SurfaceView
offre una serie di vantaggi oltre TextureView
per
riproduzione video:
- Consumo notevolmente inferiore di Google Cloud dispositivi mobili.
- 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.
- Possibilità di visualizzare i contenuti video alla massima risoluzione del display su Dispositivi Android TV che ottimizzano il livello UI.
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 animazioni o scorrere la superficie del video.
versione precedente ad Android 7.0 (livello API 24), come descritto nelle note che seguono. Per
In questo caso, è preferibile utilizzare TextureView
solo quando SDK_INT
è inferiore
24 (Android 7.0) e SurfaceView
negli altri casi.
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:
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 impostare lo stato attivo sulla visualizzazione player è importante per navigare nella riproduzione
controlli 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 Compose su Android TV, devi rendere AndroidView
attivabile e delega l'evento passando il parametro del modificatore nel campo
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. I drawable utilizzati da PlayerControlView
possono
Essere sostituito da 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.