Udostępniliśmy Media3 1.11. Ta wersja, która obsługuje zdecydowaną większość najlepszych aplikacji multimedialnych na Androida, wprowadza nowe funkcje, poprawki błędów i ulepszenia w zakresie odtwarzania, edycji i komponentów interfejsu. Rozszerzamy nasze moduły interfejsu Jetpack Compose o konfigurowalne Player miejsca i łatwe w użyciu ustawienia domyślne, interaktywne gesty, obserwatory stanu i wstępne wczytywanie krótkich filmów za pomocą PlayerPool. Zmodernizowaliśmy też integrację Media3 Cast, dodając obsługę przełącznika wyjścia SystemUI, wprowadziliśmy nowe rozszerzenie sieciowe klienta HTTP Ktor i dodaliśmy nowe narzędzia do multipleksowania plików Ogg i WAV.
Przeczytaj najważniejsze informacje i zapoznaj się z pełną listą zmian w informacjach o wersji.
Interfejs odtwarzania i Compose
Android staje się platformą, na której Compose jest najważniejszy, dlatego nadal rozwijamy moduły media3-ui-compose i media3-ui-compose-material3. Ta aktualizacja wprowadza bardziej szczegółową kontrolę nad układem odtwarzacza, bogatsze wzorce interakcji i głębszą integrację z Material3.
Konfigurowalny układ odtwarzacza
Element Composable Material 3 Player obsługuje teraz dedykowane miejsca na treści dla topControls, centerControls, bottomControls i errorOverlay. Możesz wstawić własne elementy Composable lub użyć gotowych ustawień domyślnych opublikowanych w PlayerDefaults:
Player( player = player, topControls = { PlayerDefaults.TopControls(player) }, centerControls = { PlayerDefaults.CenterControls(player) }, bottomControls = { PlayerDefaults.BottomControls(player) }, )
Element Composable Player integruje też obsługę FocusRequester, co umożliwia płynną nawigację za pomocą pada kierunkowego i klawiatury na Androidzie TV, urządzeniach składanych i komputerach.
Gesty i sterowanie szybkością odtwarzania
PlaybackSpeedState udostępnia teraz interfejs API do szybkiego przewijania do przodu i odtwarzania w zwolnionym tempie. demo-compose app pokazuje to za pomocą gestu długiego naciśnięcia, który umożliwia szybkie przewijanie do przodu, oraz wyszukiwania za pomocą dwukrotnego kliknięcia. W połączeniu z elementem ProgressSlider wprowadzonym w wersji 1.10 interfejs odtwarzacza Compose oferuje teraz bogate interakcje dotykowe i gesty.
Wstępne wczytywanie krótkich filmów za pomocą PlayerPool
W przypadku aplikacji z przesuwającymi się oknami treści multimedialnych (np. krótkich filmów w pionie) częstym problemem jest efektywne zarządzanie wieloma instancjami ExoPlayer. Media3 1.11 wprowadza PlayerPool (w common-ktx) i rememberPooledPlayer (w ui-compose), aby automatycznie obsługiwać ponowne użycie odtwarzacza i wstępne wczytywanie.
Nowy element ShortFormPlayerScreen w demo-compose pokazuje to w działaniu – jest to przewijana w pionie lista, na której odtwarzacze są grupowane, wstępnie wczytywane i płynnie ponownie używane podczas przewijania przez użytkownika.
MiniController
Nowy element Composable MiniController w media3-ui-compose-material3 zapewnia kompaktowy pasek odtwarzania, który wyświetla tytuł, wykonawcę, okładkę i postęp bieżącego elementu oraz elementy sterujące odtwarzaniem i wstrzymywaniem. Podobnie jak wszystkie nasze domyślne elementy Composable w media3-ui-compose-material3, element MiniController obsługuje integrację z dynamicznymi kolorami Material3, dzięki czemu może automatycznie dostosowywać się do motywu tapety użytkownika.Jest to idealne rozwiązanie w przypadku trwałych arkuszy dolnych lub miniodtwarzaczy, na przykład gdy użytkownik przegląda treści lub podczas aktywnych sesji Cast.
Rozszerzone kontenery stanu metadanych i błędów
Do media3-ui-compose dodaliśmy kilka nowych reaktywnych kontenerów stanu:
rememberCurrentMediaItemState– obserwowanie metadanych dotyczących aktualnie odtwarzanego elementurememberPlaylistState– obserwowanie pełnej listy odtwarzania i aktywnych indeksówrememberErrorState– śledzenie błędów odtwarzania, z pasującym elementem ComposableErrorTexti domyślnym elementemErrorOverlayw Material3
W kolejnych wersjach będziemy dodawać nowe funkcje i opcje dostosowywania. Podziel się swoją opinią w problem trackerze projektu.
Zmodernizowana integracja Cast
Media3 1.11 aktualizuje rozszerzenie Cast o opcje konfiguracji programowej i obsługę routingu na poziomie systemu operacyjnego.
CastParams i przełącznik wyjścia SystemUI
Możesz teraz skonfigurować rozszerzenie Cast za pomocą CastParams:
val castParams = CastParams.Builder() .setShowSystemOutputSwitcherOnCastButtonClick(true) .build() Cast.getSingletonInstance(context).initialize(castParams)
Ustawienie setShowSystemOutputSwitcherOnCastIconClick(true) konfiguruje MediaRouteButton tak, aby otwierał natywny przełącznik wyjścia SystemUI na obsługiwanych wersjach platformy, zapewniając ujednolicone środowisko wyboru wyjścia.
Reaktywny stan MediaRouteButton w Compose
Aplikacje korzystające z Jetpack Compose mogą teraz łatwo dodać przycisk routingu multimediów (znany też jako przycisk Cast), który automatycznie obserwuje stan okna i odpowiednio go aktualizuje. W połączeniu z CastPlayer Media3 nie jest potrzebna żadna dodatkowa logika.
@Composable fun TopAppBarWithCast() { Row { Text(text = "App Title") MediaRouteButton() } }
Ulepszenia podstawowego odtwarzania i sesji
Eclipsa Video – dynamiczne metadane HDR HAGC (API 37+)
Eclipsa Video zapewnia bardziej spójne wrażenia HDR na różnych urządzeniach dzięki spójnej podstawowej bieli HDR, adaptacyjnemu zakresowi dynamicznemu w zależności od ekranu i otoczenia, co pozwala zachować intencje twórcze na wszystkich urządzeniach.
ExoPlayer obsługuje teraz odtwarzanie niezbędnych metadanych czasowych HAGC (ST 2094-50) w przypadku multimediów progresywnych (MP4, Matroska). Odtwarzacz automatycznie łączy ścieżki metadanych HAGC z powiązaną ścieżką wideo i dostarcza metadane poza pasmem do dekodera na urządzeniach z API 37+. Na starszych urządzeniach ExoPlayer płynnie przełącza się na standardowe odtwarzanie HDR bez korekt.
Nowe rozszerzenie klienta HTTP Ktor
Nowy moduł rozszerzenia media3-datasource-ktor udostępnia KtorDataSource oparty na stosie HTTP Ktor. Jest to alternatywa dla istniejących modułów źródła danych Cronet i OkHttp, która jest przyjazna dla współprogramów i oparta na Kotlinie.
Asynchroniczne połączenia MediaSession
MediaSession.Callback zawiera teraz onConnectAsync(), który umożliwia asynchroniczne przetwarzanie prób połączenia kontrolera – na przykład w celu sprawdzenia autoryzacji przed zaakceptowaniem połączenia. Możesz zwrócić natychmiastowy Future z Futures.immediateFuture(ConnectionResult), aby uzyskać takie samo działanie jak w przypadku istniejącego onConnect.
override fun onConnectAsync( session: MediaSession, controller: MediaSession.ControllerInfo ): ListenableFuture<MediaSession.ConnectionResult> { return authenticateControllerAsync(controller) }
Bezpieczniejsze ustawienia domyślne MediaSession
W przypadku aplikacji, które nie zastępują onConnect ani onConnectAsync w MediaSession.Callback, biblioteka domyślnie używa teraz bezpieczniejszej konfiguracji. Dane sesji nie są domyślnie udostępniane niezaufanym kontrolerom, co oznacza, że aplikacje innych firm lub aplikacje spoza systemu, które nie mają dostępu do powiadomień, nie mogą uzyskiwać dostępu do danych sesji, chyba że wyraźnie zaimplementujesz te metody wywołania zwrotnego, aby autoryzować połączenie.
Nowe implementacje Muxera i analizowanie kontenerów
OggMuxer i WavMuxer
Dodaliśmy 2 nowe dedykowane multipleksery: OggMuxer do multipleksowania strumieni OPUS i VORBIS do standardowych plików .ogg oraz WavMuxer do generowania nieskompresowanych plików audio PCM .wav z reprezentacją zmiennoprzecinkową.
Analizowanie kontenerów i odniesienia do ścieżek
- Odniesienia do ścieżek MP4 (
tref):Mp4Muxer.addTrackReferenceumożliwia łączenie zależnych metadanych lub ścieżek pomocniczych z głównymi strumieniami wideo. - Wyodrębnianie rozdziałów: rozdziały QuickTime i Nero z plików MP4 (
.m4a,.m4b) oraz rozdziały Matroska są teraz wyodrębniane jako wpisy metadanychChapterdo nawigacji po audiobookach i podcastach.
Jeśli masz pytania, prośby o dodanie funkcji lub chcesz zgłosić błąd, użyj problem trackera. Czekamy na wiadomość od Ciebie!
-
PoradnikiWitamy z powrotem w serii postów na blogu „Tworzenie inteligentnych aplikacji na Androida”, w której przekształcamy podstawową aplikację na Androida w spersonalizowane, inteligentne i autonomiczne środowisko. W poprzednim poście przedstawiliśmy Jetpackera, aplikację w wersji demonstracyjnej, której będziemy używać w tej serii.
Caren Chang • Czas czytania: 6 min -
PoradnikiJetpacker to aplikacja demonstracyjna, którą nasz zespół stworzył od podstaw na tegoroczne Google I/O (przy użyciu Antigravity). Jetpacker pomaga użytkownikom planować, odkrywać i cieszyć się kolejną wielką przygodą.
Jolanda Verhoef • Czas czytania: 4 minuty -
PoradnikiWitamy z powrotem w serii postów na blogu „Tworzenie inteligentnych aplikacji na Androida”, w której przekształcamy podstawową aplikację na Androida w spersonalizowane, inteligentne i autonomiczne środowisko. W poprzednim poście omówiliśmy, jak wykorzystać Firebase AI Logic do tworzenia funkcji AI hostowanych w chmurze i hybrydowych.
Ben Weiss • Czas czytania: 6 min
Otrzymuj co tydzień najnowsze informacje o tworzeniu aplikacji na Androida na swoją skrzynkę odbiorczą.