Media3 1.11 est disponible. Cette version, qui alimente la grande majorité des meilleures applications multimédias Android, apporte de nouvelles fonctionnalités, des corrections de bugs et des améliorations au niveau de la lecture, de la modification et des composants d'interface utilisateur. Nous étendons nos modules d'interface utilisateur Jetpack Compose avec des emplacements Player personnalisables et des valeurs par défaut faciles à utiliser, des gestes interactifs, des observateurs d'état et le préchargement de vidéos courtes à l'aide de PlayerPool. Nous avons également modernisé l'intégration de Media3 Cast avec la prise en charge du sélecteur de sortie SystemUI, introduit une nouvelle extension réseau de client HTTP Ktor et ajouté de nouveaux utilitaires de multiplexage pour les fichiers Ogg et WAV.
Pour en savoir plus, consultez les points clés ci-dessous et les notes de version complètes pour obtenir la liste complète des modifications.
Interface utilisateur de lecture et Compose
Android étant désormais axé sur Compose, nous continuons à étendre les modules media3-ui-compose et media3-ui-compose-material3. Cette mise à jour offre un contrôle plus précis sur la mise en page de votre lecteur, des modèles d'interaction plus riches et une intégration plus poussée avec Material3.
Mise en page du lecteur personnalisable
Le composable Material 3 Player est désormais compatible avec les emplacements de contenu dédiés pour topControls, centerControls, bottomControls et errorOverlay. Vous pouvez insérer vos propres composables ou utiliser les valeurs par défaut prêtes à l'emploi publiées dans PlayerDefaults :
Player( player = player, topControls = { PlayerDefaults.TopControls(player) }, centerControls = { PlayerDefaults.CenterControls(player) }, bottomControls = { PlayerDefaults.BottomControls(player) }, )
Le composable Player intègre également la prise en charge de FocusRequester, ce qui permet une navigation fluide avec le pavé directionnel et le clavier sur Android TV, les appareils pliables et les environnements de bureau.
Gestes et contrôle de la vitesse de lecture
PlaybackSpeedState fournit désormais une API d'avance rapide/de ralenti. Le demo-compose app illustre cela avec un geste d'appui long pour avancer rapidement la lecture et une recherche avec un double appui. Combiné au ProgressSlider introduit dans la version 1.10, l'interface utilisateur du lecteur Compose offre désormais des interactions tactiles et gestuelles riches prêtes à l'emploi.
Préchargement de vidéos courtes avec PlayerPool
Pour les applications avec des flux multimédias à fenêtre glissante (par exemple, les vidéos verticales courtes), la gestion efficace de plusieurs instances ExoPlayer est un défi courant. Media3 1.11 introduit PlayerPool (dans common-ktx) et rememberPooledPlayer (dans ui-compose) pour gérer automatiquement le recyclage et le préchargement du lecteur.
Le nouveau ShortFormPlayerScreen dans demo-compose illustre cela en action, avec un flux de pagination verticale où les lecteurs sont mis en commun, préchargés et recyclés de manière transparente lorsque l'utilisateur fait défiler l'écran.
MiniController
Un nouveau composable MiniController dans media3-ui-compose-material3 fournit une barre de lecture compacte affichant le titre, l'artiste, la pochette et la progression de l'élément en cours, ainsi que les commandes de lecture/pause. Comme tous nos composables par défaut dans media3-ui-compose-material3, le MiniController est compatible avec l'intégration des couleurs dynamiques Material3, ce qui lui permet de s'adapter automatiquement au thème de fond d'écran de l'utilisateur.Cela est idéal pour les feuilles inférieures persistantes ou les mini-lecteurs, par exemple lorsque l'utilisateur navigue dans le contenu ou pendant les sessions Cast actives.
Conteneurs d'état étendus pour les métadonnées et les erreurs
Nous avons ajouté plusieurs nouveaux conteneurs d'état réactifs à media3-ui-compose :
rememberCurrentMediaItemState: observe les métadonnées de l'élément en cours de lecturerememberPlaylistState: observe la playlist complète et les index actifsrememberErrorState: suit les erreurs de lecture, avec un composableErrorTextcorrespondant et unErrorOverlaypar défaut dans Material3
Nous continuerons à travailler sur de nouveaux ajouts et davantage d'options de personnalisation dans les prochaines versions. N'hésitez pas à nous faire part de vos commentaires dans le outil de suivi des problèmes du projet.
Intégration Cast modernisée
Media3 1.11 met à jour l'extension Cast avec des options de configuration programmatiques et la prise en charge du routage au niveau du système d'exploitation.
CastParams et sélecteur de sortie SystemUI
Vous pouvez désormais configurer l'extension Cast à l'aide de CastParams :
val castParams = CastParams.Builder() .setShowSystemOutputSwitcherOnCastButtonClick(true) .build() Cast.getSingletonInstance(context).initialize(castParams)
La configuration de setShowSystemOutputSwitcherOnCastIconClick(true) permet au MediaRouteButton d'ouvrir le sélecteur de sortie SystemUI natif d'Android sur les versions de plate-forme compatibles, offrant ainsi une expérience unifiée de sélection de sortie.
État réactif de MediaRouteButton dans Compose
Les applications utilisant Jetpack Compose peuvent désormais facilement ajouter le bouton de routage multimédia (également appelé bouton Cast), qui observe automatiquement l'état de la boîte de dialogue et se met à jour en conséquence. Aucune autre logique n'est nécessaire lorsqu'il est utilisé avec le CastPlayer de Media3.
@Composable fun TopAppBarWithCast() { Row { Text(text = "App Title") MediaRouteButton() } }
Améliorations de la lecture et de la session de base
Eclipsa Video : métadonnées HDR dynamiques HAGC (API 37+)
Eclipsa Video promet une expérience HDR plus cohérente sur tous les appareils, avec un blanc HDR de base cohérent, une marge adaptative en fonction de l'écran et de l'environnement, garantissant ainsi que l'intention créative est préservée sur tous les appareils.
ExoPlayer est désormais compatible avec la lecture des métadonnées temporelles HAGC (ST 2094-50) nécessaires pour les contenus multimédias progressifs (MP4, Matroska). Le lecteur fusionne automatiquement les pistes de métadonnées HAGC avec la piste vidéo associée et fournit les métadonnées hors bande au décodeur sur les appareils dotés de l'API 37 ou version ultérieure. Sur les anciens appareils, ExoPlayer revient de manière transparente à une expérience de lecture HDR standard sans les ajustements.
Nouvelle extension de client HTTP Ktor
Un nouveau module d'extension media3-datasource-ktor fournit KtorDataSource, basé sur la pile HTTP Ktor. Il s'agit d'une alternative Kotlin-first et compatible avec les coroutines aux modules de source de données Cronet et OkHttp existants.
Connexions MediaSession asynchrones
MediaSession.Callback inclut désormais onConnectAsync(), qui vous permet de traiter les tentatives de connexion du contrôleur de manière asynchrone, par exemple pour vérifier l'autorisation avant d'accepter une connexion. Vous pouvez renvoyer un Future immédiat avec Futures.immediateFuture(ConnectionResult) pour le même comportement que le onConnect existant.
override fun onConnectAsync( session: MediaSession, controller: MediaSession.ControllerInfo ): ListenableFuture<MediaSession.ConnectionResult> { return authenticateControllerAsync(controller) }
Valeurs par défaut MediaSession plus sécurisées
Pour les applications qui ne remplacent pas onConnect ou onConnectAsync dans MediaSession.Callback, la bibliothèque utilise désormais une configuration plus sécurisée par défaut. Plus précisément, les données de session ne sont plus partagées par défaut avec les contrôleurs non fiables, ce qui signifie que les applications tierces ou non système qui n'ont pas accès aux notifications ne peuvent pas accéder aux données de session, sauf si vous implémentez explicitement ces méthodes de rappel pour autoriser la connexion.
Nouvelles implémentations de Muxer et analyse de conteneurs
OggMuxer et WavMuxer
Nous avons ajouté deux nouveaux multiplexeurs dédiés : OggMuxer pour multiplexer les flux OPUS et VORBIS dans des fichiers .ogg standards, et WavMuxer pour générer des fichiers audio PCM .wav non compressés et à virgule flottante.
Analyse de conteneurs et références de pistes
- Références de pistes MP4 (
tref) :Mp4Muxer.addTrackReferencepermet de lier des métadonnées dépendantes ou des pistes auxiliaires à des flux vidéo principaux. - Extraction de chapitres : les chapitres QuickTime et Nero des fichiers MP4 (
.m4a,.m4b) et les chapitres Matroska sont désormais extraits en tant qu'entrées de métadonnéesChapterpour la navigation dans les livres audio et les podcasts.
Veuillez utiliser l'outil de suivi des problèmes pour signaler tout bug ou si vous avez des questions ou des demandes de fonctionnalités. Nous attendons vos commentaires avec impatience !
-
TutorielsBienvenue dans la série d'articles de blog "Créer des applications Android intelligentes", dans laquelle nous prenons une application Android de base et la transformons en une expérience personnalisée, intelligente et autonome. Dans notre précédent article, nous avons présenté Jetpacker, l'application de démonstration que nous utiliserons tout au long de cette série.
Caren Chang • Temps de lecture : 6 min -
TutorielsJetpacker est une application de démonstration technique que notre équipe a conçue de A à Z pour la conférence Google I/O de cette année (créée à l'aide d'Antigravity). Jetpacker aide les utilisateurs à planifier, à explorer et à profiter de leur prochaine grande aventure.
Jolanda Verhoef • Temps de lecture : 4 min -
TutorielsBienvenue dans la série d'articles de blog "Créer des applications Android intelligentes", dans laquelle nous prenons une application Android de base et la transformons en une expérience personnalisée, intelligente et autonome. Dans notre précédent article, nous avons exploré comment tirer parti de Firebase AI Logic pour créer des fonctionnalités d'IA hybrides et hébergées dans le cloud.
Ben Weiss • Temps de lecture : 6 min
Recevez chaque semaine les dernières informations sur le développement Android dans votre boîte de réception.