Dev
October 2, 2026
0 views
2 min read

Media3 1.11 - What's new?

Curated by Patrick
Source: Android Developers
Media3 1.11 - What's new?
Tech Daily Byte Analysis

Google’s Android team shipped Media3 1.11, expanding the Jetpack Compose media UI with granular player slots for top, center, bottom controls and error overlays, plus focus‑requester support that smooths D‑pad and keyboard navigation on TV, foldables, and desktop. The update also introduces fast‑forward/slow‑motion gestures tied to a PlaybackSpeedState, and the ProgressSlider from the prior release, delivering out‑of‑the‑box touch interaction. A notable addition is PlayerPool and the rememberPooledPlayer helper, which recycle ExoPlayer instances for vertically scrolling short‑form feeds, a pattern that many TikTok‑style apps struggle with. The MiniController composable now offers a compact, Material 3‑themed bar with dynamic color adaptation, suitable for persistent mini‑player UIs or Cast sessions. On the casting side, CastParams can trigger Android’s native SystemUI Output Switcher, unifying output selection across supported devices, while the MediaRouteButton composable automatically reflects routing state. The library also adds a Ktor‑backed datasource, giving developers a coroutine‑first alternative to Cronet and OkHttp, and supports Eclipsa Video HDR metadata (HAGC) on API 37+, merging timed HDR tracks for more consistent color rendering. Finally, new OggMuxer and WavMuxer classes enable straightforward creation of Opus/Vorbis .ogg and PCM .wav files, and MP4 track reference and chapter extraction utilities improve audiobook and podcast handling.

The release aligns with Google’s broader push to make Compose the default UI layer for Android, reducing reliance on XML and legacy view hierarchies. By providing player pooling and gesture‑rich controls, Media3 1.11 directly addresses the performance and UX demands of short‑form video platforms that dominate today’s mobile consumption. The SystemUI Output Switcher integration mirrors Android 14’s emphasis on a unified media routing experience, while the Ktor datasource reflects the Kotlin ecosystem’s shift toward coroutine‑centric networking. HDR metadata support positions Media3 as a first‑party solution for creators seeking consistent high‑dynamic‑range playback across the fragmented Android device landscape, and the new muxers respond to the growing need for lightweight audio packaging in podcasts and voice‑first apps.

Developers adopting Media3 1.11 can expect faster time‑to‑market for sophisticated media UIs, but they must test the HDR path on devices below API 37 to verify graceful fallback, and ensure that the Output Switcher call‑out does not break on devices lacking the system picker. Monitoring the stability of PlayerPool in large feeds will be crucial, as misuse could lead to resource leaks. Future releases are likely to deepen Compose integration and expand casting capabilities, so teams should keep an eye on upcoming media‑session APIs and potential deprecations of older data‑source modules.

Key Takeaways

Media3 1.11 gives Compose developers slot‑based player layouts and built‑in gesture handling, cutting boilerplate for custom controls.

PlayerPool and rememberPooledPlayer automate recycling of ExoPlayer instances, a practical solution for vertical short‑form video feeds.

CastParams now open Android’s native Output Switcher, unifying media routing UI across supported devices.

New OggMuxer, WavMuxer, and MP4 track reference utilities broaden Media3’s audio‑file creation and chapter‑extraction capabilities.

About the Source

This analysis is based on reporting by Android Developers. Here is a short excerpt for context:

Posted by Toni Heidenreich, Software Engineer, Android Media3 1.11 is out. Powering the vast majority of top Android media apps, this release brings new features, bug fixes, and improvements across playback, editing, and UI components. We're expanding our Jetpack Compose UI modules with customizable Player slots and easy to use defaults, interactive gestures, state observers, and short-form video preloading using PlayerPool. We also modernized the Media3 Cast integration with SystemUI Output Switcher support, introduced a new Ktor HTTP client network extension, and added new muxing utilities for Ogg and WAV files. Read on for key highlights, and check out the full release notes for a comprehensive list of changes. Playback UI and Compose With Android becoming Compose-first, we are continuing to expand the media3-ui-compose and media3-ui-compose-material3 modules. This update introduces more granular control over your player layout, richer interaction patterns, and deeper integration with Material3. Customizable Player layout The Material 3 Player Composable now supports dedicated content slots for topControls, centerControls, bottomControls, and errorOverlay. You can drop in your own Composables or use the ready-made defaults published in PlayerDefaults: Player( player = player, topControls = { PlayerDefaults.TopControls(player) }, centerControls = { PlayerDefaults.CenterControls(player) }, bottomControls = { PlayerDefaults.BottomControls(player) }, ) The Player Composable also integrates FocusRequester support, enabling seamless D-pad and keyboard navigation on Android TV, foldables, and desktop environments. Example for a Composable Player with customized controls Gestures and playback speed control PlaybackSpeedState now provides a fast-forward/slow-motion API. The demo-compose app showcases this with a long-press gesture to fast-forward playback and seeking with double tap. Combined with the ProgressSlider introduced in 1.10, the Compose player UI now offers rich touch and gesture interactions out of the box. Short-form video preloading with PlayerPool For apps with sliding-window media feeds (for example, short-form vertical video), managing multiple ExoPlayer instances efficiently is a common challenge. Media3 1.11 introduces PlayerPool (in common-ktx) and rememberPooledPlayer (in ui-compose) to handle player recycling and preloading automatically. The new ShortFormPlayerScreen in demo-compose shows this in action, a vertically paging feed where players are pooled, preloaded, and seamlessly recycled as the user scrolls. MiniController A new MiniController Composable in media3-ui-compose-material3 provides a compact playback bar displaying the current item's title, artist, artwork, and progress alongside play/pause controls. As all our default Composables in media3-ui-compose-material3, the MiniController supports Material3 Dynamic Color integration, allowing it to automatically adapt to the user's wallpaper theme.This is ideal for persistent bottom-sheet or mini-player affordances, for example while the user browses content or during active Cast sessions. The Media3 MiniController showing album art, media metadata and basic controls Expanded state holders for metadata and errors We added several new reactive state holders to media3-ui-compose: rememberCurrentMediaItemState – observe metadata about the currently playing item rememberPlaylistState – observe the full playlist and active indices rememberErrorState – track playback errors, with a matching ErrorText Composable and default ErrorOverlay in Material3 We'll continue working on new additions and more customization options in upcoming releases. Please share your thoughts on the project issue tracker. Modernized Cast integration Media3 1.11 updates the Cast extension with programmatic configuration options and support for OS-level routing. CastParams and SystemUI Output Switcher You can now configure the Cast extension using CastParams: val castParams = CastParams.Builder() .setShowSystemOutputSwitcherOnCastButtonClick(true) .build() Cast.getSingletonInstance(context).initialize(castParams) Setting setShowSystemOutputSwitcherOnCastIconClick(true) configures the MediaRouteButton to open Android's native SystemUI Output Switcher on supported platform versions, providing a unified output picker experience. Reactive MediaRouteButton state in Compose Apps using Jetpack Compose can now easily add the Media routing button (also known as Cast button), which automatically observes the dialog state and updates accordingly. No further logic needed when used together with Media3's CastPlayer! @Composable fun TopAppBarWithCast() { Row { Text(text = "App Title") MediaRouteButton() } } Media3 media route button in an app launching the default output switcher dialog Core playback and session enhancements Eclipsa Video - HAGC dynamic HDR metadata (API 37+) Eclipsa Video promises a more consistent HDR experience across devices, with a consistent baseline HDR white, adaptive headroom depending on the screen and the surroundings, ensuring the creative intent is preserved on all devices. ExoPlayer now supports playback of the necessary HAGC (ST 2094-50) timed metadata for progressive media (MP4, Matroska). The player automatically merges HAGC metadata tracks with the associated video track and delivers the metadata out-of-band to the decoder on API 37+ devices. On older devices, ExoPlayer seamlessly falls back to providing a standard HDR playback experience without the adjustments. Illustration to show benefits of Eclipsa Video HDR, like more consistent color contract New Ktor HTTP client extension A new media3-datasource-ktor extension module provides KtorDataSource, backed by the Ktor HTTP stack. This offers a Kotlin-first, coroutine-friendly alternative to the existing Cronet and OkHttp data source modules. Asynchronous MediaSession connections MediaSession.Callback now includes onConnectAsync(), which lets you process controller connection attempts asynchronously — for example, to verify authorization before accepting a connection. You can return an immediate Future with Futures.immediateFuture(ConnectionResult) for the same behavior as the existing onConnect. override fun onConnectAsync( session: MediaSession, controller: MediaSession.ControllerInfo ): ListenableFuture{ return authenticateControllerAsync(controller) } Safer MediaSession defaults For apps that don’t override onConnect or onConnectAsync in MediaSession.Callback, the library now defaults to a more secure configuration. Specifically, session data is no longer shared by default with untrusted controllers, meaning third-party or non-system apps lacking notification access are restricted from accessing session data unless you explicitly implement these callback methods to authorize the connection. New Muxer implementations & container parsing OggMuxer and WavMuxer We've added two new dedicated muxers: OggMuxer for muxing OPUS and VORBIS streams into standard .ogg files, and WavMuxer for generating uncompressed and floating-point PCM .wav audio files. Container parsing and track references MP4 Track References (tref): Mp4Muxer.addTrackReference allows linking dependent metadata or aux tracks to primary video streams. Chapter Extraction: QuickTime and Nero chapter from MP4 files (.m4a, .m4b), and Matroska chapters, are now extracted as Chapter metadata entries for audiobook and podcast navigation. Please use the issue tracker to report any bugs, or if you have questions or feature requests. We look forward to hearing from you!
Read the original at Android Developers

More in Dev