Une application qui lit des contenus multimédias nécessite des composants d'interface utilisateur pour afficher les contenus multimédias et contrôler la lecture. La bibliothèque Media3 inclut un module d'UI qui contient un certain nombre de composants d'UI. Pour dépendre du module d'interface utilisateur, ajoutez la dépendance suivante:
Kotlin
implementation("androidx.media3:media3-ui:1.5.0")
Groovy
implementation "androidx.media3:media3-ui:1.5.0"
Le composant le plus important est PlayerView
, une vue pour la lecture multimédia.
PlayerView
affiche la vidéo, les images, les sous-titres et la pochette de l'album pendant la lecture, ainsi que les commandes de lecture.
PlayerView
dispose d'une méthode setPlayer
pour associer et dissocier (en transmettant null
) des instances de joueur.
PlayerView
PlayerView
peut être utilisé pour la lecture de vidéos, d'images et d'audio. Il affiche la vidéo et les sous-titres en cas de lecture vidéo, les bitmaps pour la lecture d'images et peut afficher des illustrations incluses en tant que métadonnées dans les fichiers audio. Vous pouvez l'inclure dans vos fichiers de mise en page comme n'importe quel autre composant d'interface utilisateur. Par exemple, un PlayerView
peut être inclus avec le code XML suivant:
<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"/>
L'extrait ci-dessus montre que PlayerView
fournit plusieurs attributs. Ces attributs peuvent être utilisés pour personnaliser le comportement de la vue, ainsi que son apparence. La plupart de ces attributs ont des méthodes de setter correspondantes, qui peuvent être utilisées pour personnaliser la vue au moment de l'exécution. La documentation Javadoc de PlayerView
liste ces attributs et méthodes de setter plus en détail.
Une fois la vue déclarée dans le fichier de mise en page, elle peut être recherchée dans la méthode onCreate
de l'activité:
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); }
Une fois qu'un lecteur a été initialisé, il peut être associé à la vue en appelant 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();
Choisir un type de surface
L'attribut surface_type
de PlayerView
vous permet de définir le type de surface utilisé pour la lecture vidéo. En plus des valeurs spherical_gl_surface_view
(qui est une valeur spéciale pour la lecture vidéo sphérique) et video_decoder_gl_surface_view
(qui est destinée au rendu vidéo à l'aide de moteurs de rendu d'extension), les valeurs autorisées sont surface_view
, texture_view
et none
. Si la vue est destinée à la lecture audio uniquement, none
doit être utilisée pour éviter d'avoir à créer une surface, car cela peut être coûteux.
Si la vue est destinée à la lecture vidéo standard, surface_view
ou texture_view
doit être utilisée. SurfaceView
présente plusieurs avantages par rapport à TextureView
pour la lecture vidéo:
- Consommation d'énergie considérablement réduite sur de nombreux appareils.
- Calendrier des images plus précis, ce qui permet une lecture vidéo plus fluide.
- Prise en charge d'une sortie vidéo HDR de meilleure qualité sur les appareils compatibles.
- Prise en charge de la sortie sécurisée lors de la lecture de contenu protégé par DRM.
- Possibilité d'afficher le contenu vidéo à la résolution complète de l'écran sur les appareils Android TV qui mettent à l'échelle la couche d'interface utilisateur.
Dans la mesure du possible, il est donc préférable d'utiliser SurfaceView
plutôt que TextureView
.
TextureView
ne doit être utilisé que si SurfaceView
ne répond pas à vos besoins. Par exemple, lorsque des animations fluides ou un défilement de la surface vidéo sont requis avant Android 7.0 (niveau d'API 24), comme décrit dans les notes suivantes. Dans ce cas, il est préférable d'utiliser TextureView
uniquement lorsque SDK_INT
est inférieur à 24 (Android 7.0) et SurfaceView
dans le cas contraire.
Navigation avec la croix directionnelle sur Android TV
La télécommande d'Android TV est dotée d'un pavé directionnel qui envoie des commandes qui arrivent en tant qu'événement de touche à dispatchKeyEvent(KeyEvent)
de votre Activity
. Ils doivent être délégués à la vue du lecteur:
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); }
Demander la sélection de la vue du lecteur est important pour naviguer dans les commandes de lecture et ignorer les annonces. Envisagez de demander la sélection dans onCreate
de 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(); // ... }
Si vous utilisez Compose sur Android TV, vous devez rendre le AndroidView
sélectionnable et déléguer l'événement en transmettant le paramètre de modification dans le AndroidView
en conséquence:
AndroidView(
modifier = modifier
.focusable()
.onKeyEvent { playerView.dispatchKeyEvent(it.nativeKeyEvent) },
factory = { playerView }
)
Ignorer les drawables
PlayerView
utilise PlayerControlView
pour afficher les commandes de lecture et la barre de progression. Les drawables utilisés par PlayerControlView
peuvent être remplacés par des drawables portant les mêmes noms définis dans votre application. Consultez la documentation Javadoc PlayerControlView
pour obtenir la liste des drawables de contrôle pouvant être remplacés.
Personnalisation supplémentaire
Lorsque la personnalisation au-delà de celle décrite ci-dessus est requise, nous nous attendons à ce que les développeurs d'applications implémentent leurs propres composants d'interface utilisateur plutôt que d'utiliser ceux fournis par le module d'interface utilisateur de Media3.