סקירה כללית של ארכיטקטורת אפליקציות מדיה

בקטע הזה מוסבר איך להפריד אפליקציית נגן מדיה לבקר מדיה (לממשק המשתמש) ולסשן מדיה (לנגן בפועל). הוא מתאר שתי ארכיטקטורות של אפליקציות מדיה: עיצוב של לקוח/שרת שמתאים לאפליקציות אודיו, ועיצוב של פעילות יחידה לנגני וידאו. בנוסף, מוסבר איך לגרום לאפליקציות מדיה להגיב לבקרי חומרה ולשתף פעולה עם אפליקציות אחרות שמשתמשות בזרם פלט האודיו.

השחקן וממשק המשתמש

לאפליקציית מולטימדיה שמפעילה אודיו או וידאו יש בדרך כלל שני חלקים:

  • נגן שמקבל מדיה דיגיטלית ומציג אותה כסרטון או כאודיו
  • ממשק משתמש עם אמצעי בקרה להפעלת הנגן, ואפשרות להצגת מצב הנגן

ui-and-player

ב-Android אפשר ליצור נגן משלכם מאפס, או לבחור מבין האפשרויות הבאות:

  • המחלקות MediaPlayer מספקות את הפונקציונליות הבסיסית של נגן פשוט שתומך בפורמטים הנפוצים ביותר של אודיו/וידאו ובמקורות נתונים.
  • ExoPlayer היא ספרייה בקוד פתוח שמבוססת על רכיבי מסגרת מדיה ברמה נמוכה יותר, כמו MediaCodec ו-AudioTrack. ‫ExoPlayer תומך בתכונות עם ביצועים גבוהים כמו DASH, שלא זמינות ב-MediaPlayer. אפשר להתאים אישית את הקוד של ExoPlayer, וכך להוסיף רכיבים חדשים בקלות. אפשר להשתמש ב-ExoPlayer רק ב-Android מגרסה 4.1 ואילך.

סשן מדיה וממשק שליטה במדיה

ממשקי ה-API של ממשק המשתמש והנגן יכולים להיות שרירותיים, אבל אופי האינטראקציה בין שני החלקים זהה בעצם בכל אפליקציות נגני המדיה. במסגרת Android מוגדרות שתי מחלקות, media session ו-media controller,שמגדירות מבנה ברור לבניית אפליקציית נגן מדיה.

התקשורת בין סשן המדיה לבין אמצעי הבקרה של המדיה מתבצעת באמצעות קריאות חוזרות מוגדרות מראש שמתאימות לפעולות רגילות של נגן (הפעלה, השהיה, עצירה וכו'), וגם באמצעות קריאות מותאמות אישית שניתנות להרחבה, שמשמשות להגדרת התנהגויות מיוחדות שייחודיות לאפליקציה.

controller-and-session

סשן מדיה

סשן מדיה אחראי לכל התקשורת עם נגן המדיה. הוא מסתיר את ה-API של הנגן משאר האפליקציה. הנגן נקרא רק מהסשן של המדיה ששולט בו.

בסשן נשמר ייצוג של מצב השחקן (הפעלה/השהיה) ומידע על התוכן שמופעל. סשן יכול לקבל קריאות חוזרות (callback) מבקר מדיה אחד או יותר. כך אפשר לשלוט בנגן באמצעות ממשק המשתמש של האפליקציה, וגם באמצעות מכשירים נלווים שמריצים Wear OS ו-Android Auto. הלוגיקה שמגיבה לקריאות חוזרות צריכה להיות עקבית. התגובה לקריאה חוזרת MediaSession צריכה להיות זהה לא משנה איזו אפליקציית לקוח יזמה את הקריאה החוזרת.

ממשק השליטה במדיה

בקר מדיה מבודד את ממשק המשתמש. קוד ממשק המשתמש מתקשר רק עם בקר המדיה, ולא עם הנגן עצמו. בקר המדיה מתרגם פעולות של בקרת תחבורה לקריאות חוזרות לסשן המדיה. הוא גם מקבל קריאות חוזרות (callback) מסשן המדיה בכל פעם שסטטוס הסשן משתנה. הפעולה הזו מספקת מנגנון לעדכון אוטומטי של ממשק המשתמש המשויך. אמצעי בקרה של מדיה יכול להתחבר רק להפעלה אחת של מדיה בכל פעם.

כשמשתמשים בבקר מדיה ובסשן מדיה, אפשר לפרוס ממשקים או נגנים שונים בזמן הריצה. אתם יכולים לשנות את המראה או את הביצועים של האפליקציה באופן עצמאי, בהתאם ליכולות של המכשיר שבו היא פועלת.

אפליקציות וידאו לעומת אפליקציות אודיו

כשמפעילים סרטון, העיניים והאוזניים פועלות. כשמפעילים אודיו, אתם מאזינים לו, אבל אתם יכולים גם לעבוד עם אפליקציה אחרת בו-זמנית. לכל תרחיש לדוגמה יש עיצוב שונה.

אפליקציית וידאו

אפליקציית וידאו צריכה חלון לצפייה בתוכן. לכן, אפליקציית סרטונים מיושמת בדרך כלל כפעילות אחת ב-Android. המסך שבו הסרטון מוצג הוא חלק מהפעילות.

פעילות בנגן הווידאו

אפליקציית אודיו

לא תמיד צריך להציג את ממשק המשתמש של נגן אודיו. אחרי שהשמעת האודיו מתחילה, אפשר להפעיל את הנגן כמשימה ברקע. המשתמש יכול לעבור לאפליקציה אחרת ולהמשיך לעבוד תוך כדי האזנה.

כדי להטמיע את העיצוב הזה ב-Android, אפשר ליצור אפליקציית אודיו באמצעות שני רכיבים: פעילות לממשק המשתמש ושירות לנגן. אם המשתמש עובר לאפליקציה אחרת, השירות יכול לפעול ברקע. אם מחלקים את שני החלקים של אפליקציית אודיו לרכיבים נפרדים, כל אחד מהם יכול לפעול בצורה יעילה יותר. ממשק משתמש בדרך כלל פועל לזמן קצר בהשוואה לנגן, שיכול לפעול לזמן ארוך בלי ממשק משתמש.

פעילות אודיו ו-BrowserService

ספריית התמיכה מספקת שתי מחלקות להטמעת הגישה הזו של לקוח/שרת: MediaBrowserService ו-MediaBrowser. רכיב השירות מיושם כסיווג משנה של MediaBrowserService שמכיל את סשן המדיה ואת נגן המדיה. הפעילות בממשק המשתמש ובאמצעי הבקרה של המדיה צריכה לכלול MediaBrowser, שמתקשר עם MediaBrowserService.

השימוש ב-MediaBrowserService מאפשר למכשירים נלווים (כמו Android Auto ו-Wear) לגלות את האפליקציה שלכם, להתחבר אליה, לעיין בתוכן ולשלוט בהפעלה, בלי לגשת לפעילות ממשק המשתמש של האפליקציה. למעשה, יכולות להיות כמה אפליקציות שמחוברות לאותו MediaBrowserService בו-זמנית, וכל אפליקציה מקבלת MediaController משלה. אפליקציה שמציעה MediaBrowserService צריכה להיות מסוגלת לטפל בכמה חיבורים בו-זמנית.

אפליקציות מדיה ותשתית האודיו של Android

אפליקציית מדיה שמעוצבת היטב צריכה לפעול בצורה חלקה עם אפליקציות אחרות שמפעילות אודיו. צריך להכין אותו לשיתוף הטלפון ולשיתוף פעולה עם אפליקציות אחרות במכשיר שמשתמשות באודיו. בנוסף, הוא צריך להגיב לבקרות החומרה במכשיר.

plays-with-others

כל ההתנהגויות האלה מתוארות במאמר שליטה בפלט האודיו.

ספריית התאימות למדיה

ספריית media-compat כוללת מחלקות שימושיות ליצירת אפליקציות שמפעילות אודיו ווידאו. המחלקות האלה תואמות למכשירים עם Android מגרסה 2.3 (API ברמה 9) ומעלה. הן פועלות גם עם תכונות אחרות של Android כדי ליצור חוויית שימוש נוחה ומוכרת ב-Android.

ההטמעה המומלצת של סשנים של מדיה ושל בקרי מדיה היא באמצעות המחלקות MediaSessionCompat ו-MediaControllerCompat, שמוגדרות בספריית התמיכה media-compat. הם מחליפים גרסאות קודמות של המחלקות MediaSession ו-MediaController שהוצגו ב-Android 5.0 (רמת API‏ 21). המחלקות של התאימות מציעות את אותה פונקציונליות, אבל הן מקלות על פיתוח האפליקציה כי צריך לכתוב רק ל-API אחד. הספרייה דואגת לתאימות לאחור על ידי תרגום של שיטות של סשן מדיה לשיטות מקבילות בגרסאות ישנות יותר של הפלטפורמה, כשהן זמינות.

אם כבר יש לכם אפליקציה פעילה שמשתמשת במחלקות הישנות, מומלץ לעדכן למחלקות התאימות. כשמשתמשים בגרסאות התאימות, אפשר להסיר את כל הקריאות ל-registerMediaButtonReceiver() ואת כל השיטות מ-RemoteControlClient.

מדידת ביצועים

ב-Android 8.0 (רמת API‏ 26) ואילך, השיטה getMetrics() זמינה לחלק ממחלקות המדיה. הפונקציה מחזירה אובייקט PersistableBundle שמכיל פרטי הגדרה וביצועים, שמוצגים כמיפוי של מאפיינים וערכים. השיטה getMetrics() מוגדרת עבור מחלקות המדיה הבאות:

המדדים נאספים בנפרד לכל מופע ונשמרים למשך חיי המופע. אם אין מדדים זמינים, השיטה מחזירה null. המדדים בפועל שמוחזרים תלויים בסוג הכיתה.