Media3 1.11 版已發布。這個版本支援絕大多數頂尖的 Android 媒體應用程式,並在播放、編輯和 UI 元件方面推出新功能、修正錯誤及改善效能。我們將擴充 Jetpack Compose UI 模組,提供可自訂的Player插槽和易於使用的預設值、互動式手勢、狀態觀察器,以及使用 PlayerPool 預先載入短片的功能。此外,我們也更新了 Media3 Cast 整合功能,支援 SystemUI Output Switcher,並推出新的 Ktor HTTP 用戶端網路擴充功能,以及 Ogg 和 WAV 檔案的新多工公用程式。
請參閱下文的重點摘要,並查看完整的版本資訊,瞭解所有變更。
播放 UI 和 Compose
隨著 Android 成為 Compose 優先的平台,我們將持續擴充 media3-ui-compose 和 media3-ui-compose-material3 模組。本次更新可讓您更精細地控管播放器版面配置、提供更豐富的互動模式,並與 Material3 深度整合。
可自訂的播放器版面配置
Material 3 Player Composable 現在支援 topControls、centerControls、bottomControls 和 errorOverlay 的專屬內容版位。您可以插入自己的可組合項,也可以使用 PlayerDefaults 中發布的現成預設值:
Player( player = player, topControls = { PlayerDefaults.TopControls(player) }, centerControls = { PlayerDefaults.CenterControls(player) }, bottomControls = { PlayerDefaults.BottomControls(player) }, )
Player Composable 也整合了 FocusRequester 支援,可在 Android TV、摺疊式裝置和電腦環境中,順暢使用 D-Pad 和鍵盤瀏覽。
手勢和播放速度控制項
PlaybackSpeedState 現在提供快轉/慢動作 API。demo-compose app 示範了如何透過長按手勢快轉播放,以及輕觸兩下進行搜尋。搭配 1.10 版推出的 ProgressSlider,Compose 播放器 UI 現在可提供豐富的觸控和手勢互動功能。
使用 PlayerPool 預先載入短篇影片
對於具有滑動視窗媒體動態消息的應用程式 (例如短篇直向影片),有效管理多個 ExoPlayer 執行個體是常見的挑戰。Media3 1.11 推出 PlayerPool (位於 common-ktx 中) 和 rememberPooledPlayer (位於 ui-compose 中),可自動處理播放器回收和預先載入作業。
新的 ShortFormPlayerScreen demo-compose 範例展示了這項功能,使用者捲動時,系統會將播放器集中管理、預先載入及無縫回收,並以垂直分頁動態饋給的形式呈現。
MiniController
media3-ui-compose-material3 中的新 MiniController 可組合函式提供精巧的播放列,顯示目前項目的標題、藝人、專輯封面和進度,以及播放/暫停控制項。與 media3-ui-compose-material3 中的所有預設 Composables 一樣,MiniController 支援整合 Material 3 動態色彩,可自動配合使用者的桌布主題。這非常適合用於持續顯示的底部功能表或迷你播放器,例如在使用者瀏覽內容或進行投放工作階段時。
擴充中繼資料和錯誤的狀態保留項目
我們在 media3-ui-compose 中新增了多個反應式狀態持有者:
rememberCurrentMediaItemState:觀察目前播放項目的中繼資料rememberPlaylistState:觀察完整播放清單和有效索引rememberErrorState:追蹤播放錯誤,並在 Material 3 中使用相符的ErrorText可組合項和預設ErrorOverlay
我們會在日後推出的版本中,持續新增內容和提供更多自訂選項。請在專案問題追蹤器中分享您的想法。
現代化 Cast 整合
Media3 1.11 更新了 Cast 擴充功能,提供程式輔助設定選項,並支援作業系統層級的轉送。
CastParams 和 SystemUI 輸出端切換器
現在您可以使用 CastParams 設定 Cast 擴充功能:
val castParams = CastParams.Builder() .setShowSystemOutputSwitcherOnCastButtonClick(true) .build() Cast.getSingletonInstance(context).initialize(castParams)
設定 setShowSystemOutputSwitcherOnCastIconClick(true) 會設定 MediaRouteButton 在支援的平台版本上開啟 Android 原生的 SystemUI Output Switcher,提供統一的輸出選擇器體驗。
在 Compose 中使用反應式 MediaRouteButton 狀態
使用 Jetpack Compose 的應用程式現在可以輕鬆新增媒體路徑按鈕 (又稱投放按鈕),自動觀察對話方塊狀態並據此更新。與 Media3 的 CastPlayer 一起使用時,不需要其他邏輯!
@Composable fun TopAppBarWithCast() { Row { Text(text = "App Title") MediaRouteButton() } }
核心播放和工作階段強化功能
Eclipsa Video - HAGC 動態 HDR 中繼資料 (API 37 以上)
Eclipsa Video 可在不同裝置上提供更一致的 HDR 體驗,包括一致的 HDR 白色基準、根據螢幕和周圍環境調整的動態範圍,確保所有裝置都能呈現符合創意原意的畫面。
ExoPlayer 現在支援播放漸進式媒體 (MP4、Matroska) 的必要 HAGC (ST 2094-50) 時間碼中繼資料。播放器會自動將 HAGC 中繼資料軌與相關聯的視訊軌合併,並透過頻外傳輸方式,將中繼資料傳送至 API 37 以上裝置的解碼器。在舊版裝置上,ExoPlayer 會順暢地退回標準 HDR 播放體驗,不會進行調整。
新的 Ktor HTTP 用戶端擴充功能
新的 media3-datasource-ktor 擴充功能模組提供 KtorDataSource,並由 Ktor HTTP 堆疊支援。這項功能提供以 Kotlin 為主、協同程式友善的替代方案,可取代現有的 Cronet 和 OkHttp 資料來源模組。
非同步 MediaSession 連線
MediaSession.Callback 現在包含 onConnectAsync(),可讓您非同步處理控制器連線嘗試,例如在接受連線前驗證授權。您可以傳回立即 Future,並使用 Futures.immediateFuture(ConnectionResult) 取得與現有 onConnect 相同的行為。
override fun onConnectAsync( session: MediaSession, controller: MediaSession.ControllerInfo ): ListenableFuture<MediaSession.ConnectionResult> { return authenticateControllerAsync(controller) }
更安全的 MediaSession 預設值
對於未在 MediaSession.Callback 中覆寫 onConnect 或 onConnectAsync 的應用程式,程式庫現在預設會採用更安全的設定。具體來說,系統預設不會再與不受信任的控制器分享工作階段資料,也就是說,除非您明確實作這些回呼方法來授權連線,否則第三方或非系統應用程式無法存取工作階段資料 (這些應用程式沒有通知存取權)。
新的 Muxer 實作項目和容器剖析
OggMuxer 和 WavMuxer
我們新增了兩個專用多工器:OggMuxer用於將 OPUS 和 VORBIS 串流多工處理為標準 .ogg 檔案,以及 WavMuxer 用於產生未壓縮的浮點 PCM .wav 音訊檔案。
剖析容器並追蹤參照
- MP4 軌參考 (
tref):Mp4Muxer.addTrackReference可將相依中繼資料或輔助軌連結至主要影片串流。 - 章節擷取:系統現在會從 MP4 檔案 (
.m4a、.m4b) 擷取 QuickTime 和 Nero 章節,並將 Matroska 章節擷取為Chapter中繼資料項目,方便使用者瀏覽有聲書和 Podcast。
如有任何錯誤、問題或功能要求,請使用 Issue Tracker 回報。期待收到您的申請!
-
使用指南歡迎回到「建構智慧型 Android 應用程式」系列網誌文章。我們將以基本 Android 應用程式為基礎,將其轉換為個人化、智慧型和代理式體驗。在上一篇文章中,我們介紹了 Jetpacker,也就是本系列文章中會使用的示範應用程式。
Caren Chang • 6 分鐘小故事 -
使用指南Jetpacker 是我們團隊為今年的 Google I/O 大會從頭建構的技術展示應用程式 (使用 Antigravity 建構)。Jetpacker 的核心功能是協助使用者規劃、探索及享受下一場冒險之旅。
Jolanda Verhoef • 4 分鐘小故事 -
使用指南歡迎回到「建構智慧型 Android 應用程式」系列網誌文章。我們將以基本 Android 應用程式為基礎,將其轉換為個人化、智慧型和代理式體驗。在先前的文章中,我們探討了如何運用 Firebase AI Logic 建構雲端代管和混合式 AI 功能。
每週透過電子郵件接收最新的 Android 開發洞察資訊。