Media3 1.11 telah dirilis. Dengan mendukung sebagian besar aplikasi media Android teratas, rilis ini menghadirkan fitur baru, perbaikan bug, dan peningkatan di seluruh komponen pemutaran, pengeditan, dan UI. Kami memperluas modul UI Jetpack Compose dengan slot Player yang dapat disesuaikan dan default yang mudah digunakan, gestur interaktif, pengamat status, dan pramuat video pendek menggunakan PlayerPool. Kami juga memodernisasi integrasi Media3 Cast dengan dukungan Pengalih Output SystemUI, memperkenalkan ekstensi jaringan klien HTTP Ktor baru, dan menambahkan utilitas muxing baru untuk file Ogg dan WAV.
Baca terus untuk mengetahui sorotan utama, dan lihat catatan rilis lengkap untuk mengetahui daftar perubahan yang komprehensif.
UI Pemutaran dan Compose
Dengan Android yang menjadi Compose-first, kami terus memperluas modul media3-ui-compose dan media3-ui-compose-material3. Update ini memperkenalkan kontrol yang lebih terperinci atas tata letak pemutar, pola interaksi yang lebih kaya, dan integrasi yang lebih mendalam dengan Material3.
Tata letak Pemutar yang dapat disesuaikan
Composable Pemutar Material 3 kini mendukung slot konten khusus untuk topControls, centerControls, bottomControls, dan errorOverlay. Anda dapat memasukkan Composable Anda sendiri atau menggunakan default siap pakai yang dipublikasikan di PlayerDefaults:
Player( player = player, topControls = { PlayerDefaults.TopControls(player) }, centerControls = { PlayerDefaults.CenterControls(player) }, bottomControls = { PlayerDefaults.BottomControls(player) }, )
Composable Player juga mengintegrasikan dukungan FocusRequester, yang memungkinkan navigasi D-pad dan keyboard yang lancar di Android TV, perangkat foldable, dan lingkungan desktop.
Gestur dan kontrol kecepatan pemutaran
PlaybackSpeedState kini menyediakan API fast-forward/slow-motion. The demo-compose app menampilkannya dengan gestur tekan lama untuk mempercepat pemutaran dan penelusuran dengan ketuk dua kali. Dikombinasikan dengan ProgressSlider yang diperkenalkan di 1.10, UI pemutar Compose kini menawarkan interaksi sentuh dan gestur yang kaya secara langsung.
Pramuat video pendek dengan PlayerPool
Untuk aplikasi dengan feed media jendela geser (misalnya, video vertikal pendek), mengelola beberapa instance ExoPlayer secara efisien adalah tantangan umum. Media3 1.11 memperkenalkan PlayerPool (di common-ktx) dan rememberPooledPlayer (di ui-compose) untuk menangani daur ulang dan pramuat pemutar secara otomatis.
ShortFormPlayerScreen baru di demo-compose menunjukkan hal ini dalam tindakan, feed halaman vertikal tempat pemutar dikumpulkan, dimuat sebelumnya, dan didaur ulang dengan lancar saat pengguna men-scroll.
MiniController
Composable MiniController baru di media3-ui-compose-material3 menyediakan panel pemutaran ringkas yang menampilkan judul, artis, karya seni, dan progres item saat ini bersama dengan kontrol putar/jeda. Sebagai semua Composable default kami di media3-ui-compose-material3, MiniController mendukung integrasi Warna Dinamis Material3, sehingga dapat otomatis beradaptasi dengan tema wallpaper pengguna.Hal ini ideal untuk panel bawah persisten atau fasilitas miniplayer, misalnya saat pengguna menjelajahi konten atau selama sesi Cast aktif.
Penampung status yang diperluas untuk metadata dan error
Kami menambahkan beberapa penampung status reaktif baru ke media3-ui-compose:
rememberCurrentMediaItemState– mengamati metadata tentang item yang sedang diputarrememberPlaylistState– mengamati playlist lengkap dan indeks aktifrememberErrorState– melacak error pemutaran, dengan ComposableErrorTextyang cocok danErrorOverlaydefault di Material3
Kami akan terus berupaya menambahkan fitur baru dan opsi penyesuaian lainnya dalam rilis mendatang. Harap sampaikan pendapat Anda tentang issue tracker project.
Integrasi Cast yang dimodernisasi
Media3 1.11 memperbarui ekstensi Cast dengan opsi konfigurasi terprogram dan dukungan untuk perutean tingkat OS.
CastParams dan Pengalih Output SystemUI
Anda kini dapat mengonfigurasi ekstensi Cast menggunakan CastParams:
val castParams = CastParams.Builder() .setShowSystemOutputSwitcherOnCastButtonClick(true) .build() Cast.getSingletonInstance(context).initialize(castParams)
Menetapkan setShowSystemOutputSwitcherOnCastIconClick(true) mengonfigurasi MediaRouteButton untuk membuka Pengalih Output SystemUI native Android pada versi platform yang didukung, sehingga memberikan pengalaman pemilih output yang terpadu.
Status MediaRouteButton reaktif di Compose
Aplikasi yang menggunakan Jetpack Compose kini dapat dengan mudah menambahkan tombol perutean Media (juga dikenal sebagai tombol Cast), yang secara otomatis mengamati status dialog dan memperbarui sesuai dengan status tersebut. Tidak diperlukan logika lebih lanjut saat digunakan bersama dengan CastPlayer Media3.
@Composable fun TopAppBarWithCast() { Row { Text(text = "App Title") MediaRouteButton() } }
Peningkatan pemutaran dan sesi inti
Eclipsa Video - metadata HDR dinamis HAGC (API 37+)
_Eclipsa Video_ menjanjikan pengalaman HDR yang lebih konsisten di berbagai perangkat, dengan HDR putih dasar yang konsisten, headroom adaptif bergantung pada layar dan lingkungan sekitar, sehingga memastikan maksud kreatif dipertahankan di semua perangkat.
ExoPlayer kini mendukung pemutaran metadata berwaktu HAGC (ST 2094-50) yang diperlukan untuk media progresif (MP4, Matroska). Pemutar secara otomatis menggabungkan trek metadata HAGC dengan trek video terkait dan mengirimkan metadata di luar band ke dekoder di perangkat API 37+. Di perangkat lama, ExoPlayer akan kembali ke pengalaman pemutaran HDR standar tanpa penyesuaian.
Ekstensi klien HTTP Ktor baru
Modul ekstensi media3-datasource-ktor baru menyediakan KtorDataSource, yang didukung oleh stack HTTP Ktor. Hal ini menawarkan alternatif yang mengutamakan Kotlin dan ramah coroutine untuk modul sumber data Cronet dan OkHttp yang ada.
Koneksi MediaSession asinkron
MediaSession.Callback kini menyertakan onConnectAsync(), yang memungkinkan Anda memproses upaya koneksi pengontrol secara asinkron — misalnya, untuk memverifikasi otorisasi sebelum menerima koneksi. Anda dapat menampilkan Future langsung dengan Futures.immediateFuture(ConnectionResult) untuk perilaku yang sama dengan onConnect yang ada.
override fun onConnectAsync( session: MediaSession, controller: MediaSession.ControllerInfo ): ListenableFuture<MediaSession.ConnectionResult> { return authenticateControllerAsync(controller) }
Default MediaSession yang lebih aman
Untuk aplikasi yang tidak mengganti onConnect atau onConnectAsync di MediaSession.Callback, library kini menggunakan konfigurasi yang lebih aman secara default. Secara khusus, data sesi tidak lagi dibagikan secara default dengan pengontrol yang tidak tepercaya, yang berarti aplikasi pihak ketiga atau non-sistem yang tidak memiliki akses notifikasi dibatasi untuk mengakses data sesi kecuali jika Anda secara eksplisit menerapkan metode callback ini untuk mengotorisasi koneksi.
Implementasi Muxer baru &parsing penampung
OggMuxer dan WavMuxer
Kami telah menambahkan dua muxer khusus baru: OggMuxer untuk muxing stream OPUS dan VORBIS ke dalam file .ogg standar, dan WavMuxer untuk membuat file audio PCM .wav yang tidak terkompresi dan floating-point.
Parsing penampung dan referensi trek
- Referensi Trek MP4 (
tref):Mp4Muxer.addTrackReferencememungkinkan menghubungkan metadata dependen atau trek tambahan ke stream video utama. - Ekstraksi Bab: Bab QuickTime dan Nero dari file MP4 (
.m4a,.m4b), dan bab Matroska, kini diekstrak sebagai entri metadataChapteruntuk navigasi buku audio dan podcast.
Gunakan issue tracker untuk melaporkan bug, atau jika Anda memiliki pertanyaan atau permintaan fitur. Kami menantikan balasan dari Anda.
-
PanduanSelamat datang kembali di seri postingan blog "Membangun aplikasi Android cerdas" tempat kami mengambil aplikasi Android dasar dan mengubahnya menjadi pengalaman yang dipersonalisasi, cerdas, dan agentic. Dalam postingan sebelumnya, kami memperkenalkan Jetpacker, aplikasi demo yang akan kami gunakan di seluruh seri ini.
Caren Chang • 6 menit untuk dibaca -
PanduanJetpacker adalah aplikasi pameran teknis yang dibuat tim kami dari awal untuk Google I/O tahun ini (dibuat menggunakan Antigravity). Pada intinya, Jetpacker membantu pengguna merencanakan, menjelajahi, dan menikmati petualangan besar mereka berikutnya.
Jolanda Verhoef • 4 menit untuk dibaca -
PanduanSelamat datang kembali di seri postingan blog "Membangun aplikasi Android cerdas" tempat kami mengambil aplikasi Android dasar dan mengubahnya menjadi pengalaman yang dipersonalisasi, cerdas, dan agentic. Dalam postingan sebelumnya, kami membahas cara memanfaatkan Firebase AI Logic untuk membangun fitur AI hybrid dan yang dihosting di cloud.
Ben Weiss • 6 menit untuk dibaca
Dapatkan insight pengembangan Android terbaru yang dikirim ke kotak masuk Anda setiap minggu.