Media3 1.11 ist da. Diese Version wird in den meisten Top-Android-Media-Apps verwendet und bietet neue Funktionen, Fehlerkorrekturen und Verbesserungen für die Wiedergabe, Bearbeitung und UI-Komponenten. Wir erweitern unsere Jetpack Compose-UI-Module mit anpassbaren Player Slots und benutzerfreundlichen Standardeinstellungen, interaktiven Gesten, Statusbeobachtern und dem Vorabladen von Kurzvideos mit PlayerPool. Außerdem haben wir die Media3 Cast-Integration mit Unterstützung für den SystemUI-Ausgabewähler modernisiert, eine neue Ktor-HTTP-Client-Netzwerkerweiterung eingeführt und neue Muxing-Dienstprogramme für Ogg- und WAV-Dateien hinzugefügt.
Im Folgenden finden Sie die wichtigsten Neuerungen. Eine vollständige Liste der Änderungen finden Sie in den Versionshinweisen.
Wiedergabe-UI und Compose
Da Android immer mehr auf Compose setzt, erweitern wir die Module media3-ui-compose und media3-ui-compose-material3 kontinuierlich. Mit diesem Update haben Sie eine genauere Kontrolle über das Player-Layout, mehr Interaktionsmuster und eine tiefere Integration mit Material3.
Anpassbares Player-Layout
Die Material3-Player-Composable unterstützt jetzt spezielle Content-Slots für topControls, centerControls, bottomControls und errorOverlay. Sie können Ihre eigenen Composables einfügen oder die vorgefertigten Standardeinstellungen verwenden, die in PlayerDefaults veröffentlicht wurden:
Player( player = player, topControls = { PlayerDefaults.TopControls(player) }, centerControls = { PlayerDefaults.CenterControls(player) }, bottomControls = { PlayerDefaults.BottomControls(player) }, )
Die Player-Composable bietet auch FocusRequester-Unterstützung, die eine nahtlose Steuerkreuz- und Tastaturnavigation auf Android TV, faltbaren Geräten und in Desktop-Umgebungen ermöglicht.
Gesten und Steuerung der Wiedergabegeschwindigkeit
PlaybackSpeedState bietet jetzt eine API für schnellen Vorlauf und Zeitlupe. Das demo-compose app veranschaulicht dies mit einer Geste für langes Drücken zum schnellen Vorlauf und einer Geste für Doppeltippen zum Suchen. In Kombination mit dem in Version 1.10 eingeführten ProgressSlider bietet die Compose-Player-UI jetzt standardmäßig umfassende Touch- und Gesteninteraktionen.
Vorabladen von Kurzvideos mit PlayerPool
Bei Apps mit Media-Feeds mit gleitendem Fenster (z. B. vertikale Kurzvideos) ist die effiziente Verwaltung mehrerer ExoPlayer-Instanzen eine häufige Herausforderung. Mit Media3 1.11 werden PlayerPool (in common-ktx) und rememberPooledPlayer (in ui-compose) eingeführt, um das Player-Recycling und das Vorabladen automatisch zu verwalten.
Der neue ShortFormPlayerScreen in demo-compose zeigt dies in Aktion: ein vertikal paginierter Feed, in dem Player gepoolt, vorab geladen und nahtlos wiederverwendet werden, während der Nutzer scrollt.
MiniController
Eine neue MiniController-Composable in media3-ui-compose-material3 bietet eine kompakte Wiedergabeleiste mit dem Titel, dem Interpreten, dem Cover und dem Fortschritt des aktuellen Elements sowie Steuerelementen für die Wiedergabe und Pause. Wie alle unsere Standard-Composables in media3-ui-compose-material3 unterstützt auch MiniController die dynamische Farbintegration von Material3, sodass sie sich automatisch an das Hintergrundbild-Design des Nutzers anpasst. Das ist ideal für dauerhafte Bottom-Sheet- oder Miniplayer-Affordances, z. B. wenn der Nutzer Inhalte durchsucht oder während aktiver Cast-Sitzungen.
Erweiterte Status-Holder für Metadaten und Fehler
Wir haben media3-ui-compose mehrere neue reaktive Status-Holder hinzugefügt:
rememberCurrentMediaItemState– Metadaten zum aktuell wiedergegebenen Element beobachtenrememberPlaylistState– die vollständige Playlist und aktive Indexe beobachtenrememberErrorState– Wiedergabefehler verfolgen, mit einer passendenErrorText-Composable und einem Standard-ErrorOverlayin Material3
Wir arbeiten in den kommenden Versionen weiter an neuen Ergänzungen und weiteren Anpassungsoptionen. Teilen Sie uns Ihre Meinung in der Problemverfolgung des Projekts mit.
Modernisierte Cast-Integration
In Media3 1.11 wird die Cast-Erweiterung mit programmatischen Konfigurationsoptionen und Unterstützung für das Routing auf Betriebssystemebene aktualisiert.
CastParams und SystemUI-Ausgabewähler
Sie können die Cast-Erweiterung jetzt mit CastParams konfigurieren:
val castParams = CastParams.Builder() .setShowSystemOutputSwitcherOnCastButtonClick(true) .build() Cast.getSingletonInstance(context).initialize(castParams)
Wenn Sie setShowSystemOutputSwitcherOnCastIconClick(true) festlegen, wird der MediaRouteButton so konfiguriert, dass auf unterstützten Plattformversionen der native SystemUI-Ausgabewähler von Android geöffnet wird. So erhalten Sie eine einheitliche Ausgabewahl.
Reaktiver MediaRouteButton-Status in Compose
Apps, die Jetpack Compose verwenden, können jetzt ganz einfach das Media-Routing-Symbol (auch als Cast-Symbol bezeichnet) hinzufügen. Der Dialogstatus wird automatisch beobachtet und entsprechend aktualisiert. In Kombination mit CastPlayer von Media3 ist keine weitere Logik erforderlich.
@Composable fun TopAppBarWithCast() { Row { Text(text = "App Title") MediaRouteButton() } }
Verbesserungen bei der Kernwiedergabe und Sitzung
Eclipsa Video – dynamische HAGC-HDR-Metadaten (API 37+)
Eclipsa Video sorgt für ein einheitlicheres HDR-Erlebnis auf allen Geräten. Es bietet ein einheitliches HDR-Weiß als Grundlage und einen adaptiven Headroom, der vom Bildschirm und der Umgebung abhängt. So wird die kreative Absicht auf allen Geräten beibehalten.
ExoPlayer unterstützt jetzt die Wiedergabe der erforderlichen zeitgesteuerten HAGC-Metadaten (ST 2094-50) für progressive Medien (MP4, Matroska). Der Player führt HAGC-Metadatentracks automatisch mit dem zugehörigen Videotrack zusammen und liefert die Metadaten auf Geräten mit API 37+ außerhalb des Bandes an den Decoder. Auf älteren Geräten bietet ExoPlayer nahtlos eine Standard-HDR-Wiedergabe ohne die Anpassungen.
Neue Ktor-HTTP-Client-Erweiterung
Ein neues media3-datasource-ktor Erweiterungsmodul bietet KtorDataSource, das auf dem Ktor HTTP-Stack basiert. Dies ist eine Kotlin-First-Alternative zu den vorhandenen Cronet- und OkHttp-Datenquellenmodulen, die mit Coroutinen kompatibel ist.
Asynchrone MediaSession-Verbindungen
MediaSession.Callback enthält jetzt onConnectAsync(), mit dem Sie Versuche zur Controllerverbindung asynchron verarbeiten können, z. B. um die Autorisierung zu überprüfen, bevor Sie eine Verbindung akzeptieren. Sie können sofort ein Future mit Futures.immediateFuture(ConnectionResult) zurückgeben, um dasselbe Verhalten wie bei der vorhandenen onConnect zu erzielen.
override fun onConnectAsync( session: MediaSession, controller: MediaSession.ControllerInfo ): ListenableFuture<MediaSession.ConnectionResult> { return authenticateControllerAsync(controller) }
Sicherere MediaSession-Standardeinstellungen
Für Apps, die onConnect oder onConnectAsync in MediaSession.Callback nicht überschreiben, verwendet die Bibliothek jetzt standardmäßig eine sicherere Konfiguration. Insbesondere werden Sitzungsdaten standardmäßig nicht mehr für nicht vertrauenswürdige Controller freigegeben. Das bedeutet, dass Apps von Drittanbietern oder Nicht-System-Apps ohne Benachrichtigungszugriff nicht auf Sitzungsdaten zugreifen können, es sei denn, Sie implementieren diese Callback-Methoden explizit, um die Verbindung zu autorisieren.
Neue Muxer-Implementierungen und Container-Parsing
OggMuxer und WavMuxer
Wir haben zwei neue spezielle Muxer hinzugefügt: OggMuxer zum Muxen von OPUS- und VORBIS-Streams in Standard-.ogg-Dateien und WavMuxer zum Generieren unkomprimierter und Gleitkomma-PCM-.wav-Audiodateien.
Container-Parsing und Track-Referenzen
- MP4-Track-Referenzen (
tref):Mp4Muxer.addTrackReferenceermöglicht die Verknüpfung abhängiger Metadaten oder Aux-Tracks mit primären Videostreams. - Kapitel-Extraktion: QuickTime- und Nero-Kapitel aus MP4-Dateien (
.m4a,.m4b) und Matroska-Kapitel werden jetzt alsChapter-Metadateneinträge für die Navigation in Hörbüchern und Podcasts extrahiert.
Verwenden Sie die Problemverfolgung, um Fehler zu melden oder Fragen zu stellen oder Feature-Anfragen zu senden. Wir freuen uns auf Ihre Antwort.
-
AnleitungenWillkommen zurück zu unserer Blogpost-Reihe „Intelligente Android-Apps entwickeln“. Hier zeigen wir, wie Sie eine einfache Android-App in eine personalisierte, intelligente und agentenbasierte App verwandeln. In unserem vorherigen Beitrag haben wir Jetpacker vorgestellt, die Demo-App, die wir in dieser Reihe verwenden.
Caren Chang • 6 Minuten Lesezeit -
AnleitungenJetpacker ist eine technische Showcase-App, die unser Team von Grund auf für die Google I/O dieses Jahres entwickelt hat (mit Antigravity). Im Grunde hilft Jetpacker Nutzern, ihr nächstes großes Abenteuer zu planen, zu erkunden und zu genießen.
Jolanda Verhoef • 4 Minuten Lesezeit -
AnleitungenWillkommen zurück zu unserer Blogpost-Reihe „Intelligente Android-Apps entwickeln“. Hier zeigen wir, wie Sie eine einfache Android-App in eine personalisierte, intelligente und agentenbasierte App verwandeln. In unserem vorherigen Beitrag haben wir uns angesehen, wie Sie mit Firebase AI Logic cloudbasierte und hybride KI-Funktionen entwickeln können.
Ben Weiss • 6 Minuten Lesezeit
Lassen Sie sich Woche für Woche die neuesten Informationen zur Android-Entwicklung zusenden.