גרסה Media3 1.11 יצאה לאור. הגרסה הזו, שמפעילה את רוב האפליקציות המובילות של מדיה ב-Android, כוללת תכונות חדשות, תיקוני באגים ושיפורים ברכיבי ההפעלה, העריכה וממשק המשתמש. אנחנו מרחיבים את מודולי ממשק המשתמש של Jetpack Compose עם Playerמשבצות שניתנות להתאמה אישית, הגדרות ברירת מחדל קלות לשימוש, מחוות אינטראקטיביות, כלי מעקב אחר מצב וטעינה מראש של סרטונים בפורמט קצר באמצעות PlayerPool. בנוסף, ביצענו מודרניזציה בשילוב של Media3 Cast עם תמיכה ב-SystemUI Output Switcher, הוספנו תוסף רשת חדש של לקוח Ktor HTTP, והוספנו כלי עזר חדשים למיקס של קובצי Ogg ו-WAV.
בהמשך מפורטים השינויים העיקריים, ובנתוני הגרסה מופיעה רשימה מלאה של השינויים.
ממשק המשתמש של ההפעלה והכתיבה
מערכת Android הופכת ל-Compose-first, ואנחנו ממשיכים להרחיב את המודולים 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) }, )
ה-Composable Player משלב גם תמיכה ב-FocusRequester, ומאפשר ניווט חלק באמצעות מקשי החיצים (D-pad) והמקלדת ב-Android TV, במכשירים מתקפלים ובסביבות מחשב.
תנועות ושליטה במהירות ההפעלה
PlaybackSpeedState כולל עכשיו API להילוך מהיר/איטי. אפשר לראות את זה ב-demo-compose app, שבו לחיצה ארוכה מאפשרת להריץ קדימה את ההפעלה ולחיצה כפולה מאפשרת להגיע לנקודה מסוימת בסרטון. בנוסף ל-ProgressSlider שהוצג בגרסה 1.10, ממשק המשתמש של נגן Compose מציע עכשיו אינטראקציות עשירות של מגע ומחוות, ללא צורך בהגדרה.
טעינה מראש של סרטונים קצרים באמצעות PlayerPool
באפליקציות עם פידים של מדיה בחלון הזזה (לדוגמה, סרטונים קצרים בפורמט אנכי), ניהול יעיל של כמה מופעים של ExoPlayer הוא אתגר נפוץ. ב-Media3 1.11 נוספו PlayerPool (ב-common-ktx) ו-rememberPooledPlayer (ב-ui-compose) כדי לטפל אוטומטית בשימוש חוזר בנגן ובטעינה מראש.
הדוגמה החדשה ShortFormPlayerScreen ב-demo-compose ממחישה את הפעולה הזו. זהו פיד עם דפדוף אנכי שבו השחקנים מאוגדים, נטענים מראש וממוחזרים בצורה חלקה בזמן שהמשתמש גולל.
MiniController
רכיב MiniController Composable חדש ב-media3-ui-compose-material3 מספק סרגל הפעלה קומפקטי שמציג את שם הפריט הנוכחי, האומן, הגרפיקה וההתקדמות לצד אמצעי הבקרה של ההפעלה וההשהיה. כמו כל רכיבי ה-Composable שמוגדרים כברירת מחדל ב-media3-ui-compose-material3, רכיב ה-MiniController תומך בשילוב של צבעים דינמיים של Material3, כך שהוא יכול להתאים את עצמו באופן אוטומטי לטפט של המשתמש.זה אידיאלי לממשקי משתמש קבועים של גיליון תחתון או מיני-נגן, למשל בזמן שהמשתמש מעיין בתוכן או במהלך סשנים פעילים של Cast.
מאגרי מצב מורחבים למטא-נתונים ולשגיאות
הוספנו כמה מחזיקי מצב ריאקטיביים חדשים ל-media3-ui-compose:
-
rememberCurrentMediaItemState– צפייה במטא-נתונים של הפריט שמופעל כרגע -
rememberPlaylistState– צפייה בפלייליסט המלא ובאינדקסים הפעילים -
rememberErrorState– מעקב אחרי שגיאות בהפעלת רצועות, עםErrorTextComposable תואם ו-defaultErrorOverlayב-Material3
אנחנו נמשיך לעבוד על תוספות חדשות ועל עוד אפשרויות להתאמה אישית בגרסאות הבאות. נשמח לשמוע את דעתך על כלי המעקב אחר בעיות בפרויקט.
שילוב מודרני של Cast
בגרסה 1.11 של Media3, הרחבנו את התוסף Cast עם אפשרויות הגדרה פרוגרמטיות ותמיכה בניתוב ברמת מערכת ההפעלה.
CastParams ומתג מעבר למכשיר אחר בממשק המשתמש של המערכת
עכשיו אפשר להגדיר את תוסף Cast באמצעות CastParams:
val castParams = CastParams.Builder() .setShowSystemOutputSwitcherOnCastButtonClick(true) .build() Cast.getSingletonInstance(context).initialize(castParams)
ההגדרה setShowSystemOutputSwitcherOnCastIconClick(true) קובעת שבגרסאות נתמכות של הפלטפורמה, MediaRouteButton ייפתח הכלי המובנה של Android לבחירת פלט, וכך מספקת חוויה אחידה של בחירת פלט.
מצב תגובתי של MediaRouteButton ב-Compose
באפליקציות שמשתמשות ב-Jetpack Compose, אפשר עכשיו להוסיף בקלות את לחצן ניתוב המדיה (שנקרא גם הכפתור להפעלת Cast), שמתעדכן אוטומטית בהתאם למצב תיבת הדו-שיח. אין צורך בלוגיקה נוספת כשמשתמשים בה יחד עם CastPlayer של Media3.
@Composable fun TopAppBarWithCast() { Row { Text(text = "App Title") MediaRouteButton() } }
שיפורים בהפעלה ובסשן
Eclipsa Video - HAGC dynamic HDR metadata (API 37+)
Eclipsa Video מבטיחה חוויית HDR עקבית יותר במכשירים שונים, עם נקודת בסיס עקבית של לבן ב-HDR, מרווח דינמי משתנה בהתאם למסך ולסביבה, כדי להבטיח שהכוונה הקריאטיבית תישמר בכל המכשירים.
מעכשיו, ExoPlayer תומך בהפעלה של מטא-נתונים עם חותמת זמן של HAGC (ST 2094-50) שנדרשים למדיה פרוגרסיבית (MP4, Matroska). הנגן ממזג באופן אוטומטי את טראקים של מטא-נתונים של HAGC עם טראק הווידאו המשויך, ומעביר את המטא-נתונים מחוץ לפס אל המפענח במכשירים עם API בגרסה 37 ומעלה. במכשירים ישנים יותר, ExoPlayer חוזר באופן אוטומטי לחוויית הפעלה רגילה של HDR ללא ההתאמות.
תוסף חדש של לקוח HTTP ב-Ktor
מודול חדש של תוסף 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
באפליקציות שלא מבטלות את onConnect או את onConnectAsync ב-MediaSession.Callback, הספרייה מוגדרת עכשיו כברירת מחדל להגדרה מאובטחת יותר. באופן ספציפי, נתוני סשן לא משותפים יותר כברירת מחדל עם בקרי גישה לא מהימנים. כלומר, לאפליקציות של צד שלישי או לאפליקציות שאינן מערכתיות שאין להן גישה להודעות, אין אפשרות לגשת לנתוני סשן, אלא אם מטמיעים באופן מפורש את שיטות הקריאה החוזרת האלה כדי לאשר את החיבור.
הטמעות חדשות של Muxer וניתוח של קונטיינרים
OggMuxer ו-WavMuxer
הוספנו שני מְרַבְּבִים ייעודיים חדשים: OggMuxer לריבוב OPUS וזרמי VORBIS לקובצי .ogg רגילים, ו- WavMuxer ליצירת קובצי אודיו .wav PCM לא דחוסים עם נקודה צפה.
ניתוח מאגר תגים ומעקב אחר הפניות
- הפניות לרצועות MP4 (
tref):Mp4Muxer.addTrackReferenceמאפשרות לקשר מטא-נתונים תלויים או רצועות עזר לסטרימינג של סרטונים ראשיים. - חילוץ פרקים: פרקים של QuickTime ו-Nero מקובצי MP4 (
.m4a,.m4b) ופרקים של Matroska, נחלצים עכשיו כרשומות מטא-נתונים שלChapterלניווט בספרי אודיו ובפודקאסטים.
כדי לדווח על באגים, לשאול שאלות או לשלוח בקשות להוספת תכונות, אפשר להשתמש בכלי למעקב אחרי בעיות. נשמח לשמוע ממך!
-
מדריכיםברוכים השבים לסדרת הפוסטים בבלוג בנושא "פיתוח אפליקציות חכמות ל-Android". בסדרה הזו אנחנו לוקחים אפליקציה בסיסית ל-Android והופכים אותה לחוויה מותאמת אישית, חכמה ודינמית. בפוסט הקודם הצגנו את Jetpacker, אפליקציית ההדגמה שבה נשתמש לאורך הסדרה הזו.
Caren Chang • משך הקריאה: 6 דקות -
מדריכיםJetpacker היא אפליקציה טכנית לדוגמה שהצוות שלנו בנה מאפס לכנס Google I/O של השנה (האפליקציה נבנתה באמצעות Antigravity). המהות של Jetpacker היא לעזור למשתמשים לתכנן את ההרפתקה הגדולה הבאה שלהם, לגלות מקומות חדשים וליהנות מהחוויה.
Jolanda Verhoef • משך הקריאה: 4 דקות -
מדריכיםברוכים השבים לסדרת הפוסטים בבלוג בנושא "פיתוח אפליקציות חכמות ל-Android". בסדרה הזו אנחנו לוקחים אפליקציה בסיסית ל-Android והופכים אותה לחוויה מותאמת אישית, חכמה ודינמית. בפוסט הקודם שלנו הסברנו איך להשתמש ב-Firebase AI Logic כדי ליצור תכונות AI היברידיות שמתארחות בענן.
Ben Weiss • משך הקריאה: 6 דקות
רוצים לקבל טיפים עדכניים לפיתוח Android ישירות לאימייל כל שבוע?