הטמעה של שלט רחוק

ההטמעה של בקרת הרדיו מבוססת על MediaSession ועל MediaBrowse, שמאפשר לאפליקציות מדיה ועוזר קולי לשלוט ברדיו. מידע נוסף זמין במאמר הבא: בניית אפליקציות מדיה למכוניות ב-developer.android.com.

יישום עץ דפדוף במדיה מסופק בתמיכה בשידור רדיו של מכונית ספרייה ב-packages/apps/Car/libs. הספרייה הזו גם מכילה תוספות של ProgramSelector להמרה ל-URI וממנו. מומלץ להשתמש בהטמעות רדיו להשתמש בספרייה הזו כדי ליצור את עץ הגלישה המשויך.

מתג להחלפת מקור המדיה

כדי לאפשר מעבר חלק בין הרדיו לאפליקציות אחרות שמוצגות במדיה, הספרייה car-media-common מכילה מחלקות שצריך לשלב ברדיו אפליקציה. ניתן לכלול את MediaAppSelectorWidget ב-XML של אפליקציית הרדיו (הסמל והתפריט הנפתח שנמצאים בשימוש באפליקציות הרדיו והמדיה להפניות):

<com.android.car.media.common.MediaAppSelectorWidget
    android:id="@+id/app_switch_container"
    android:layout_width="@dimen/app_switch_widget_width"
    android:layout_height="wrap_content"
    android:background="@drawable/app_item_background"
    android:gravity="center" />

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

AppSelectionFragment newFragment = AppSelectionFragment.create(widget,
            packageName, fullScreen);
    newFragment.show(mActivity.getSupportFragmentManager(), null);

יש הטמעה לדוגמה בהטמעה של אפליקציית הרדיו, נמצא ב-packages/apps/Car/Radio.

מפרטי בקרה מפורטים

MediaSession (דרך MediaSession.Callback) מספק מנגנוני בקרה לתוכנית הרדיו שמופעלת כרגע:

  • onPlay, onStop. (ביטול) השתקה של הפעלת רדיו.
  • onPause השהיה עם העברת זמן (אם נתמך).
  • onPlayFromMediaId מפעילים תוכן מתיקייה ברמה העליונה. למשל, "הפעלת FM" או "Play Radio".
  • onPlayFromUri מפעילים תדירות ספציפית. לדוגמה, "Play 88.5 FM".
  • onSkipToNext, onSkipToPrevious. האזנה לסרטון הבא או לסרטון הקודם .
  • onSetRating להוסיף למועדפים או להסיר מהם.

MediaBrowser חושף קובץ כוונון MediaItem מעל שלושה סוגים של ספריות ברמה עליונה:

  • (אופציונלי) תוכניות (תחנות). בדרך כלל משתמשים במצב הזה מכשירי רדיו עם כוונון כפול כדי לציין את כל תחנות הרדיו הזמינות שניתנות לכוונון במיקום של המשתמש.
  • מועדפים. תוכניות רדיו שנוספו לרשימת המועדפים, יכול להיות שחלק מהן לא זמין (מחוץ לטווח הקבלה).
  • ערוצי תדרים. כל הערוצים האפשריים פיזית באזור הנוכחי (87.9, 88.1, 88.3, 88.5, 88.7, 88.9, 89.1 וכן הלאה). לכל רצועה יש ספרייה נפרדת ברמה העליונה.
מבנה העץ של MediaBrowserService
איור 2. מבנה העץ של MediaBrowserService

כל רכיב בכל אחת מהתיקיות האלו (AM/FM/Programs) הוא MediaItem עם URI שניתן להשתמש בו עם MediaSession כדי לכוונן. כל תיקייה ברמה העליונה (AM/FM/Programs) היא MediaItem עם MediaId יכולים להיות בשימוש עם MediaSession כדי להפעיל את הסרטון, והם נתון לשיקול דעתו של ה-OEM (יצרן הציוד המקורי). עבור לדוגמה, "Play FM", "Play AM", ו-"Play Radio" הן כל שאילתות הרדיו הלא ספציפיות שמשתמשות mediaId לשליחה לאפליקציית הרדיו של ה-OEM. אפליקציית הרדיו היא שקובעת מה להשמיע הבקשה הכללית וה-mediaId.

MediaSession

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

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

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

לא נעשה שימוש ב-onPlayFromSearch כשהמטרה שלו היא לתכנת. באחריות הלקוח (אפליקציה נלווית) כדי לבחור תוצאת חיפוש מעץ MediaBrowser. מעבר שהאחריות על אפליקציית הרדיו תגביר את המורכבות, דורשת חוזים רשמיים שאילתות מחרוזות צריכות להופיע, ולגרום לחוויית משתמש לא שווה בחומרה שונה פלטפורמות שונות.

הערה: אפליקציית הרדיו לא כוללת אפשרויות נוספות מידע שימושי לחיפוש שם של תחנה שלא נחשף ללקוח דרך הממשק של MediaBrowser.

הדילוג לתחנה הבאה או הקודמת תלוי בהקשר הנוכחי:

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

אפליקציית הרדיו מטפלת בפעולות האלה.

טיפול בשגיאות

TransportControls הפעולות ('הפעלה', 'עצירה' ו'הבא') לא מספק משוב לגבי השאלה אם הפעולה מצליח או לא. הדרך היחידה לציין שגיאה היא להגדיר את MediaSession מדינה ל: STATE_ERROR עם הודעת שגיאה.

אפליקציית הרדיו צריכה לטפל בפעולות האלה ולבצע אותן או להגדיר מצב שגיאה. אם ביצוע הפקודה של Play לא מיידי, יש לשנות את מצב ההפעלה ל- STATE_CONNECTING (במקרה של כוונון ישיר) או STATE_SKIPPING_TO_PREVIOUS או NEXT בזמן הרצת הפקודה.

הלקוח צריך לצפות ב- PlaybackState ולוודא שהסשן שינה את התוכנית הנוכחית לתוכנית שהתבקשה או שהוזנה מצב שגוי. האורך המקסימלי של STATE_CONNECTING הוא 30 שניות. אבל כוונון ישיר של תדר AM/FM אמור לפעול מהר יותר.

הוספה והסרה של מועדפים

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

בניגוד להגדרות הקבועות מראש מהדור הקודם, המודל הזה מניח שהמועדפים לא מסודרים ולא מוגבלים רשימה של מיקומים מועדפים שמורים הוקצה למשבצת מספרית (בדרך כלל 1 עד 6). כתוצאה מכך, מערכות מבוססות-הגדרה מראש לא יתאימו ל-onSetRating פעולה.

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

MediaBrowser

כדי לציין את התדרים או את שמות הערוצים הפיזיים (בעת כוונון לערוץ שרירותי שמתאים לטכנולוגיית רדיו נתונה) תקפים באזור נתון, כל הערוצים התקינים (התדרים) רשומים לכל תדר. באזור ארה"ב, מדובר ב-101 ערוצי FM בטווח של 87.8 עד טווח של 108.0 מגה-הרץ (בריווח של 0.2 מגה-הרץ) וערוצים של 117 AM בטווח של 530 עד 1,700kHz (בריווח של 10kHz). מכיוון שרדיו באיכות HD משתמש באותו שטח פרסום, הוא לא מוצג בנפרד.

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

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

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

  • EXTRA_BCRADIO_FOLDER_TYPE = "android.media.extra.EXTRA_BCRADIO_FOLDER_TYPE" אחת מהערכים הבאים:
    • BCRADIO_FOLDER_TYPE_PROGRAMS = 1 תוכניות שזמינות כרגע.
    • BCRADIO_FOLDER_TYPE_FAVORITES = 2 מועדפים.
    • BCRADIO_FOLDER_TYPE_BAND = 3 כל הערוצים הפיזיים של להקה מסוימת.

    אין צורך להגדיר שדות מטא-נתונים מותאמים אישית שספציפיים לרדיו, כי כל הנתונים הרלוונטיים נכנסים לסכמה הקיימת של MediaBrowser.MediaItem:

    • שם המועדון (RDS PS, DAB Service name). MediaDescription.getTitle.
    • תדר FM. URI (יש לעיין במידע נוסף ProgramSelector) או MediaDescription.getTitle (אם רשומה נמצאת בתיקייה BROADCASTRADIO_FOLDER_TYPE_BAND).
    • מזהים ספציפיים לרדיו (RDS PI, DAB SId). בוצע ניתוח של MediaDescription.getMediaUri ל-ProgramSelector.

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

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

    הערה: כברירת מחדל, החלוקה לדפים מוטמעת כברירת מחדל onLoadChildren() וריאנט ללא טיפול באפשרויות.

    רשומות קשורות מכל סוגי הרשימות (ערוצים גולמיים, תוכניות שנמצאו מועדפים) עשויים להיות מזהי mediaId שונים (תלוי באפליקציית הרדיו, תמיכה הספרייה תהיה שונה). מזהי ה-URI (בטופס ProgramSelector) שונים בין ערוצים גולמיים ותוכניות שנמצאים ברוב המקרים (למעט FM ללא RDS, אבל לרוב יהיו זהות בין התוכניות שנמצאו לבין התוכניות המועדפות (חוץ מאשר, לדוגמה, כש-AF עודכן).

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

    פעולות כוונון מיוחדות

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

    כדי לתמוך בפעולות כאלה, בחלק מהספריות ברמה העליונה יש את FLAG_PLAYABLE קבוצת סימונים (יחד עם FLAG_BROWSABLE) לתיקיות).

    פעולה כוונון ל: איך לדווח על הבעיה
    הפעלת רדיו כל ערוץ רדיו startService(ACTION_PLAY_BROADCASTRADIO)

    או,

    playFromMediaId(MediaBrowser.getRoot())
    הפעלת FM כל ערוץ FM השמעת הפרטים מתוך mediaId של רצועת ה-FM.

    האפליקציה מחליטה לאיזו תוכנית לצפות. הדבר בדרך כלל הערוץ ששודר לאחרונה מהרשימה. לפרטים על ACTION_PLAY_BROADCASTRADIO, ראו כוונות הפעלה כלליות.

    חיפוש וחיבור לשירות

    האפליקציה PackageManager יכולה למצוא ישירות את רדיו השידורים של MediaBrowserService עץ. כדי לעשות זאת, צריך להתקשר אל resolveService עם כוונת הרכישה ACTION_PLAY_BROADCASTRADIO (מידע נוסף זמין בקטע כוונות הפעלה כלליות) וגם דגל MATCH_SYSTEM_ONLY. כדי למצוא את כל השירותים שמספקים שירותי רדיו ( יכולים להיות יותר מאישור אחד; לדוגמה, להפריד בין AM/FM לבין הלוויין), השתמשו queryIntentServices

    השירות שסומן מטפל בקישור android.media.browse.MediaBrowserService בכוונה טובה. המידע הזה מאומת באמצעות GTS.

    כדי להתחבר אל MediaBrowserService שנבחר, יצירה מופע MediaBrowser של רכיב שירות נתון ו-connect. לאחר יצירת החיבור, אפשר לקבל כינוי ל-MediaSession דרך getSessionToken

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

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

    1. מוצאים את שירות הרדיו (התקשרו אל resolveService ל- ACTION_PLAY_BROADCASTRADIO).
    2. יוצרים MediaBrowser ואז מתחברים אליו.
    3. קביעת הנוכחות של MediaItem עם EXTRA_BCRADIO_FOLDER_TYPE נוסף.

    הערה: ברוב המקרים הלקוח צריך לסרוק את כל עצי MediaBrowser זמינים לזיהוי כל המקורות הזמינים עבור מכשיר נתון.

    שמות של רצועות

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

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

    • AM
    • FM
    • DAB

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

    כוונות כלליות למשחק

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

    • android.car.intent.action.PLAY_BROADCASTRADIO
    • android.car.intent.action.PLAY_AUDIOCD: CD-DA או CD-Text
    • android.car.intent.action.PLAY_DATADISC: דיסק נתונים אופטיים כמו CD/DVD, אבל לא CD-DA (יכול להיות CD במצב משולב)
    • android.car.intent.action.PLAY_AUX: בלי לציין אילו יציאת AUX
    • android.car.intent.action.PLAY_BLUETOOTH
    • android.car.intent.action.PLAY_USB: בלי לציין אילו התקן USB
    • android.car.intent.action.PLAY_LOCAL: אחסון מדיה מקומי (פלאש מובנה)

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

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

    כדי להקל על הטמעה של לקוחות מסוימים, יש דרך חלופית הנפקה של פקודת Play כזו (כאשר אפליקציית הרדיו צריכה ליישם גם את הפקודה הזו): מנפיקה את playFromMediaId עם ה-RootId של צומת השורש (משמש בתור mediaId). אומנם צומת ברמה הבסיסית (root) לא ניתן להפעלה, ה-RootId שלו הוא מחרוזת שרירותית שאפשר להגדיר כ-mediaId. עם זאת, לא נדרשים לקוחות כדי להבין את הניואנס הזה.

    בורר תוכניות

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

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

    • המזהה הראשי. מזהה ייחודי וקבוע של רדיו נתון שלא משתנה אבל לא מספיק כדי לכוונן את התחנה הזו. לדוגמה, קוד PI של RDS, שעשוי להיות מתורגם לחתימה על קריאה בארה"ב.
    • מזהים משניים. מזהים נוספים שמועילים לכוונון לתחנה הזו (לדוגמה, תדירות), אולי כולל מזהים טכנולוגיות רדיו. לדוגמה, לתחנת DAB יכולה להיות חלופה לשידור אנלוגי.

    כדי להפעיל את ProgramSelector כך שיתאים אל MediaBrowser- או בפתרון מבוסס MediaSession, יש להגדיר סכימת URI כדי להציג אותה בסדר טורי. הסכימה היא מוגדר כך:

    broadcastradio://program/<primary ID type>/<primary ID>?
    <secondary ID type>=<secondary ID>&<secondary ID type>=<secondary ID>
    

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

    • broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=88500&AMFM_FREQUENCY=103300
    • broadcastradio://program/AMFM_FREQUENCY/102100
    • broadcastradio://program/DAB_SID_EXT/14895264?RDS_PI=1234

    בחלק הרשות (מארח AKA) של program יש מקום בעתיד. המחרוזות של סוג המזהה צוינו באופן מדויק בתור השמות שלהם בהגדרת HAL 2.x של IdentifierType ובערך הוא מספר עשרוני או הקסדצימלי (עם קידומת 0x).

    כל המזהים הספציפיים לספק מיוצגים על ידי VENDOR_ . לדוגמה, VENDOR_0 עבור VENDOR_START וגם VENDOR_1 ל-VENDOR_START ול-1. מזהי URI כאלה ספציפיים את חומרת הרדיו שדרכה הם נוצרו ואי אפשר להעביר אותם בין מכשירים שנוצרו על ידי יצרני ציוד מקורי שונים.

    צריך להקצות את מזהי ה-URI האלה לכל פריט MediaItem בתפריט הרדיו ברמה העליונה תיקיות. בנוסף, MediaSession צריך לתמוך ב-playFromMediaId ו-playFromUri. עם זאת, ה-URI מיועד בעיקר לרדיו חילוץ מטא-נתונים (כמו תדר FM) ואחסון מתמיד. אין להבטיח שה-URI יהיה זמין לכל פריטי המדיה (לדוגמה, כאשר ה-URI ה-framework עדיין לא תומך בסוג המזהה). מצד שני, מזהה המדיה תמיד פועל. לא מומלץ ללקוחות להשתמש ב-URI כדי לבחור פריטים הסשן הנוכחי של MediaBrowser. במקום זאת, צריך להשתמש ב-playFromMediaId. עם זאת, לא אופציונלי לאפליקציית ההצגה, ומזהי URI חסרים שמורים למקרים שבהם יש הצדקה מוצדקת.

    העיצוב הראשוני השתמש בנקודתיים יחידה במקום ברצף :// אחרי החלק של הסכמה. עם זאת, האפשרות הראשונה לא נתמכת על ידי android.net.Uri להפניות URI מוחלטות לפי היררכיה.

    סוגי מקורות אחרים

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

    אפליקציה אחת עשויה להציג כמה סוגים של מקורות. במקרים כאלה, מומלץ ליצור MediaBrowserService נפרד עבור כל סוג של מקור. גם אם בהגדרה יש מספר מקורות מוצגים/MediaBrowserServices, מומלץ מאוד לנהל מפגש מדיה אחד במסגרת אפליקציה.

    תקליטור אודיו

    בדומה לתקליטור אודיו, האפליקציה שמציגה דיסקים כאלה לחשוף את MediaBrowser עם ערך אחד שניתן לדפדף בו (או יותר, אם יש למערכת מגש להחלפת CD), שמכיל את כל הטראקים של תקליטור מסוים. אם המערכת אינו מכיר את הטראקים בכל תקליטור (לדוגמה, כשכל הדיסקים מוכנסים למחסנית בבת אחת ולא קוראת את כולן), ואז MediaItem עבור הדיסק כולו יהיה PLAYABLE, ולא BROWSABLE ועוד PLAYABLE. אם אין דיסק בתהליך משבצת נתונה, הפריט יהיה לא PLAYABLE או BROWSABLE (אבל כל משבצת תמיד חייבת להימצא בעץ).

     מבנה עץ של תקליטור אודיו
    איור 3. מבנה עץ של תקליטור אודיו.

    הערכים האלה יסומנו באופן דומה לזה של תיקיות רדיו שמשודרות הם; הן יכילו שדות נוספים שמוגדרים ב-MediaDescription API:

    • EXTRA_CD_TRACK: לכל MediaItem בתקליטור אודיו, מספר טראק מבוסס אחד.
    • EXTRA_CD_DISK: מספר דיסק מבוסס אחד.

    עבור מערכת שתומכת ב-CD-Text ודיסק תואם, MediaItem ברמה העליונה את שם הדיסק. באופן דומה, MediaItems עבור טראקים כוללים את שם הטראק.

    כניסת עזר

    אפליקציה שמציגה קלט עזר חושפת עץ MediaBrowser בערך אחד (או יותר, כשיש כמה יציאות) שמייצגות את ה-AUX ביציאה. ה-MediaSession התואם לוקח mediaId ועובר למקור הזה אחרי קבלת הבקשה של playFromMediaId.

    מבנה עץ AUX
    איור 4. מבנה עץ AUX.

    כל רשומה של AUX MediaItem כוללת שדה נוסף EXTRA_AUX_PORT_NAME מוגדר לשם היציאה שאינו מותאם לשוק המקומי בלי ה-AUX לביטוי. לדוגמה, 'AUX 1' היה מוגדר ל-"1", "AUX" קדמי" ל'חזית' ו-AUX למחרוזת ריקה. במקומות שאינם באנגלית, השם התג יישאר אותה מחרוזת באנגלית. לא סביר כמו לגבי EXTRA_BCRADIO_BAND_NAME_EN, הערכים מוגדרים על ידי ה-OEM (יצרן הציוד המקורי) ולא מוגבל לרשימה מוגדרת מראש.

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

    שדות נוספים

    מגדירים את השדות הבאים:

    • EXTRA_CD_TRACK = "android.media.extra.CD_TRACK"
    • EXTRA_CD_DISK = "android.media.extra.CD_DISK"
    • EXTRA_AUX_PORT_NAME = "android.media.extra.AUX_PORT_NAME"

    הלקוח צריך לבדוק את MediaItems ברמה העליונה עבור רכיבים שמכילים את שדה נוסף EXTRA_CD_DISK או EXTRA_AUX_PORT_NAME הוגדרה.

    דוגמאות מפורטות

    הדוגמאות הבאות מתייחסות למבנה העץ של MediaBrowser עבור סוגי מקורות חלק מהעיצוב הזה.

    שידור רדיו MediaBrowserService (מטפל ב-ACTION_PLAY_BROADCASTRADIO):

    • תחנות (ניתנות לעיון)EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_PROGRAMS
      • URI של BBC One (ניתנות להפעלה): broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=90500
      • ABC 88.1 (הפעלה) URI: broadcastradio://program/RDS_PI/5678?AMFM_FREQUENCY=88100
      • ABC 88.1 HD1 (הפעלה) URI: broadcastradio://program/HD_STATION_ID_EXT/158241DEADBEEF?AMFM_FREQUENCY=88100&RDS_PI=5678
      • ABC 88.1 HD2 (הפעלה) URI: broadcastradio://program/HD_STATION_ID_EXT/158242DEADBEFE
      • 90.5FM (הפעלה) – FM ללא RDSURI: broadcastradio://program/AMFM_FREQUENCY/90500
      • URI של 620 AM (הפעלה): broadcastradio://program/AMFM_FREQUENCY/620
      • URI של BBC One (להפעלה): broadcastradio://program/DAB_SID_EXT/1E24102?RDS_PI=1234
    • מועדפים (ניתנות לעיון, להפעלה)EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_FAVORITES
      • URI של BBC One (להפעלה): broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=101300
      • URI של BBC Two (לא ניתן להפעלה): broadcastradio://program/RDS_PI/1300?AMFM_FREQUENCY=102100
    • AM (ניתן לעיון, להפעלה): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="AM"
      • URI של שעה 530 (הפעלה): broadcastradio://program/AMFM_FREQUENCY/530
      • URI של 540 AM (הפעלה): broadcastradio://program/AMFM_FREQUENCY/540
      • URI של 550 AM (הפעלה): broadcastradio://program/AMFM_FREQUENCY/550
    • FM (ניתן לעיון, להפעלה): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="FM"
      • URI של 87.7FM (הפעלה): broadcastradio://program/AMFM_FREQUENCY/87700
      • URI של 87.9FM (הפעלה): broadcastradio://program/AMFM_FREQUENCY/87900
      • URI של 88.1FM (הפעלה): broadcastradio://program/AMFM_FREQUENCY/88100
    • DAB (להפעלה): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="DAB"

    Audio CD MediaBrowserService (מטפל ב-ACTION_PLAY_AUDIOCD):

    • דיסק 1 (להפעלה) EXTRA_CD_DISK=1
    • דיסק 2 (ניתן לעיון, להפעלה) EXTRA_CD_DISK=2
      • טראק 1 (הפעלה) EXTRA_CD_TRACK=1
      • טראק 2 (הפעלה) EXTRA_CD_TRACK=2
    • תקליטור המוזיקה שלי (ניתן לעיון, להפעלה) EXTRA_CD_DISK=3
      • הכול בעצמי (הפעלה) EXTRA_CD_TRACK=1
      • רזוס, רזוס (משחקייה) EXTRA_CD_TRACK=2
    • משבצת 4 ריקה (לא ניתנת להפעלה) EXTRA_CD_DISK=4

    AUX MediaBrowserService (מטפל ב-ACTION_PLAY_AUX):

    • AUX קדמי (הפעלה) EXTRA_AUX_PORT_NAME="front"
    • AUX אחורי (הפעלה) EXTRA_AUX_PORT_NAME="rear"