הטמעת השליטה ברדיו מבוססת על MediaSession
ו-MediaBrowse
, שמאפשרים לאפליקציות מדיה ולעוזרות הקוליות לשלוט ברדיו. מידע נוסף זמין במאמר פיתוח אפליקציות מדיה לכלי רכב בכתובת developer.android.com.
הטמעה של עץ גלישה של מדיה זמינה בספרייה car-broadcastradio-support ב-packages/apps/Car/libs
. הספרייה הזו מכילה גם תוספים של ProgramSelector להמרה מ-URI אל URI ומ-URI אל 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
. הפעלת תוכן מכל תיקייה ברמה העליונה. לדוגמה, "Play 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 וכו'). לכל להקה יש ספרייה נפרדת ברמה העליונה.
כל רכיב בכל אחת מהתיקיות האלה (AM/FM/Programs) הוא MediaItem עם URI שאפשר להשתמש בו עם MediaSession כדי לכוונן. כל תיקייה ברמה העליונה (AM/FM/Programs) היא MediaItem עם mediaId שאפשר להשתמש בו עם MediaSession כדי להפעיל את ההפעלה, והוא נתון לשיקול דעתו של יצרן הציוד המקורי. לדוגמה, 'הפעלת רדיו FM', 'הפעלת רדיו AM' ו'הפעלת רדיו' הן שאילתות רדיו לא ספציפיות שמשתמשות ב-mediaId כדי לשלוח לאפליקציית הרדיו של יצרן המכשיר. אפליקציית הרדיו היא זו שמחליטה מה להפעיל על סמך הבקשה הגנרית וה-mediaId.
MediaSession
מכיוון שאין מושג של השהיה של שידור, הפעולות 'הפעלה', 'השהיה' ו'הפסקה' לא תמיד חלות על רדיו. ברדיו, הפעולה 'הפסקה' משויכת להשתקת השידור, ואילו הפעולה 'הפעלה' משויכת להסרת ההשתקה.
חלק ממכשירי הרדיו (או האפליקציות) מאפשרים לדמות השהיה של שידור בסטרימינג על ידי שמירת התוכן במטמון והפעלה שלו מאוחר יותר. במקרים כאלה, צריך להשתמש ב-onPause
.
הפעלה מפעולות של mediaId ו-URI נועדה לכוונן לתחנה שאוחזרה מהממשק MediaBrowser. mediaId הוא מחרוזת שרירותית שמספקת אפליקציית הרדיו כדי להחיל ערך ייחודי (כך שמזהה נתון מפנה לפריט אחד בלבד) ויציב (כך שלפריט נתון יש את אותו מזהה לאורך כל הסשן) שמשמש לזיהוי תחנה נתונה. מזהה ה-URI יהיה בסכימה מוגדרת היטב. בקיצור, פורמט של ProgramSelector ב-URI. כך אפשר לשמור על מאפיין הייחודיות, אבל הוא לא חייב להיות יציב, ויכול להשתנות אם התחנה עוברת לתדר אחר.
הדגל 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,700 קילו-הרץ (באמצעות רווח של 10 קילו-הרץ). מכיוון שהרדיו באיכות HD משתמש באותו מרחב ערוצים, הוא לא מוצג בנפרד.
רשימת תוכניות הרדיו הזמינות כרגע היא רשימה רגילה, כלומר אי אפשר להציג אותה לפי תבניות כמו קיבוץ לפי קבוצת שידור אודיו ישיר (DAB).
יכול להיות שלא תוכלו לשנות את ההגדרות של רשימת המועדפים. לדוגמה, אם תוכנית מסוימת מחוץ לטווח. יכול להיות שאפליקציית הרדיו תזהה אם אפשר לכוון אליה מראש, ויכול להיות שלא. במקרה כזה, יכול להיות שהמערכת לא תסמן את הרשומה כניתנת להפעלה.
כדי לזהות תיקיות ברמה העליונה, נעשה שימוש באותו מנגנון שבו נעשה שימוש ב-Bluetooth.
כלומר, חבילת Extras של האובייקט
MediaDescription
מכילה שדה ספציפי ל-tuner, בדיוק כמו ש-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).
MediaDescription.getTitle
. - תדר FM. URI (ראו ProgramSelector) או
MediaDescription.getTitle
(אם הרשומה נמצאת בתיקייהBROADCASTRADIO_FOLDER_TYPE_BAND
). - מזהי רדיו ספציפיים (RDS PI, DAB SId).
MediaDescription.getMediaUri
מנותח ל-ProgramSelector.
בדרך כלל אין צורך לאחזר תדר FM של רשומה בתוכנית הנוכחית או ברשימת המועדפים (כי הלקוח אמור לפעול לפי מזהי מדיה). עם זאת, אם יידרשו נתונים כאלה (למשל, למטרות תצוגה), הם יהיו נוכחים ב-URI וניתן יהיה לנתח אותם ל-
ProgramSelector
. עם זאת, לא מומלץ להשתמש ב-URI כדי לבחור פריטים בסשן הנוכחי. פרטים נוספים זמינים במאמרProgramSelector
.כדי למנוע בעיות שקשורות לביצועים או לחיבור, שירות MediaBrowser חייב לתמוך בחלוקה לדפים:
EXTRA_PAGE
EXTRA_PAGE_SIZE
- פרמטרים נוספים ל-
subscribe()
הערה: כברירת מחדל, חלוקה לדפים מיושמת כברירת מחדל בגרסה
onLoadChildren()
ללא טיפול באפשרויות.יכול להיות שלרשומות קשורות מכל סוגי הרשימות (ערוצים גולמיים, תוכניות שנמצאו ומועדפים) יהיו מזהי media שונים (זה תלוי באפליקציית הרדיו, בספריית התמיכה הם יהיו שונים). ברוב המקרים, מזהי ה-URI (בפורמט ProgramSelector) שונים בין ערוצים גולמיים לבין תוכניות שנמצאו (למעט FM ללא RDS), אבל ברוב המקרים הם זהים בין תוכניות שנמצאו לבין תוכניות מועדפות (למעט, למשל, כש-AF עודכן).
כשיש מזהי mediaId שונים לפריטים מסוגים שונים של רשימות, אפשר לבצע פעולות שונות לגבי כל רשימה. אפשר לעבור ברשימת המועדפים או ברשימת כל התוכניות ב-
onSkipToNext
, בהתאם לתיקייה שבה נבחרהMediaItem
לאחרונה (ראו MediaSession).פעולות מיוחדות שקשורות ללחן
רשימת התוכניות מאפשרת למשתמשים לכוון לתחנה ספציפית, אבל לא מאפשרת להם להגיש בקשות כלליות כמו 'כוונון לתדר FM', שעלולות לגרום לכוונון לתחנה שהאזנתם לה לאחרונה בתחום התדרים של FM.
כדי לתמוך בפעולות כאלה, בחלק מהספריות ברמה העליונה מוגדר הדגל
FLAG_PLAYABLE
(יחד עם הדגלFLAG_BROWSABLE
לתיקיות).פעולה מעבר לערוץ איך להנפיק הפעלת רדיו כל ערוץ רדיו startService(ACTION_PLAY_BROADCASTRADIO)
או,
playFromMediaId(MediaBrowser.getRoot())
Play 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
. אחרי יצירת החיבור, אפשר לקבל את ה-handle של MediaSession דרךgetSessionToken
.אפליקציית הרדיו יכולה להגביל את החבילות של הלקוחות שמותר להן להתחבר בהטמעה של השירות ב-
onGetRoot
. האפליקציה אמורה לאפשר לאפליקציות מערכת להתחבר בלי להוסיף אותן לרשימת ההיתרים. פרטים על הוספה לרשימת ההיתרים זמינים במאמר אישור החבילה והחתימת של אפליקציית Assistant.אם האפליקציה הספציפית למקור (לדוגמה, אפליקציית רדיו) מותקנת במכשיר ללא תמיכה במקור כזה, היא עדיין תציג את עצמה כזו שתטפל בכוונה
ACTION_PLAY_BROADCASTRADIO
, אבל העץ של MediaBrowser לא יכיל תגים ספציפיים לרדיו. לכן, לקוח שרוצה לבדוק אם מקור מסוים זמין במכשיר צריך:- מאתרים את שירות הרדיו (התקשרו למספר
resolveService
לקבלת מידע עלACTION_PLAY_BROADCASTRADIO
). - יוצרים את
MediaBrowser
ומתחברים אליו. - איך בודקים אם
MediaItem
קיים באמצעות התוסףEXTRA_BCRADIO_FOLDER_TYPE
?
הערה: ברוב המקרים, הלקוח צריך לסרוק את כל עצי MediaBrowser הזמינים כדי לזהות את כל המקורות הזמינים במכשיר נתון.
שמות של להקות
רשימת הלהקות מיוצגת על ידי קבוצה של ספריות ברמה העליונה עם תג מסוג תיקייה שמוגדר לערך
BCRADIO_FOLDER_TYPE_BAND
. הכותרות שלMediaItem
הן מחרוזות מותאמות לשוק המקומי שמייצגות את שמות הלהקות. ברוב המקרים היא תהיה זהה לתרגום לאנגלית, אבל הלקוח לא יכול להסתמך על ההנחה הזו.כדי לספק מנגנון יציב לחיפוש של להקות מסוימות, מתווסף תג נוסף לתיקיות של להקות,
EXTRA_BCRADIO_BAND_NAME_EN
. זהו שם לא מתורגם של הלהקה, והוא יכול להיות רק אחד מהערכים המוגדרים מראש הבאים:AM
FM
DAB
אם הלהקה לא מופיעה ברשימה הזו, אין להגדיר את התג של שם הלהקה. עם זאת, אם הלהקה נמצאת ברשימה, צריך להגדיר לה תג. ברדיו HD לא מפורטים תדרים נפרדים, כי הוא משתמש באותו אמצעי תקשורת כמו AM/FM.
כוונות כלליות של צפייה
כל אפליקציה שמוקדשת להפעלת מקור נתון (כמו רדיו או תקליטור) חייבת לטפל בכוונת הפעלה כללית כדי להתחיל להפעיל תוכן כלשהו, אולי ממצב לא פעיל (לדוגמה, אחרי הפעלה). האפליקציה בוחרת את התוכן להפעלה, אבל בדרך כלל זהו טראק מה-CD או תוכנית הרדיו שהופעלו לאחרונה.לכל מקור אודיו מוגדר כוונה נפרדת:
android.car.intent.action.PLAY_BROADCASTRADIO
android.car.intent.action.PLAY_AUDIOCD
: CD-DA או CD-Textandroid.car.intent.action.PLAY_DATADISC
: דיסק נתונים אופטי כמו CD/DVD, אבל לא CD-DA (יכול להיות דיסק במודל משולב)android.car.intent.action.PLAY_AUX
: בלי לציין איזה משקע עזר (AUX)android.car.intent.action.PLAY_BLUETOOTH
android.car.intent.action.PLAY_USB
: בלי לציין איזה התקן USBandroid.car.intent.action.PLAY_LOCAL
: אחסון מדיה מקומי (פלאש מובנה)
בחרנו להשתמש בכוונות (intents) בפקודת ההפעלה הכללית, כי הן פותרות שתי בעיות בו-זמנית: פקודת ההפעלה הכללית עצמה וגילוי השירותים. יתרון נוסף של כוונת השימוש הזו הוא האפשרות לבצע פעולה פשוטה כזו בלי לפתוח סשן של MediaBrowser.
גילוי השירותים הוא למעשה הבעיה החשובה יותר שנפתרת באמצעות הכוונות האלה. כך התהליך של זיהוי השירותים פשוט וברור (ראו זיהוי וחיבור של שירותים).
כדי להקל על חלק מההטמעות של הלקוח, יש דרך חלופית להנפיק פקודת Play כזו (שגם היא צריכה להיות מוטמעת באפליקציית הרדיו): הרצת
playFromMediaId
עם rootId של צומת הבסיס (שמשמש בתור mediaId). צומת הבסיס לא מיועד להפעלה, אבל ה-rootId שלו הוא מחרוזת שרירותית שאפשר להשתמש בה כ-mediaId. עם זאת, הלקוחות לא נדרשים להבין את הניואנסים האלה.ProgramSelector
הערך
mediaId
מספיק כדי לבחור ערוץ מתוךMediaBrowserService
, אבל הוא קשור לסשן ולא עקבי בין ספקים. במקרים מסוימים, יכול להיות שהלקוח יצטרך להשתמש ב-pointer מוחלט (למשל תדירות מוחלטת) כדי לשמור עליו בין סשנים ומכשירים.בעידן של שידורי רדיו דיגיטליים, תדר פשוט לא מספיק כדי לכוון לתחנה ספציפית. לכן, צריך להשתמש ב-
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
החלק של הרשות (המארח) ב-
program
מספק מקום להרחבת התוכנית בעתיד. מחרוזות הסוג של המזהה מצוינות בדיוק כשמות שלהן בהגדרה שלIdentifierType
ב-HAL 2.x, ופורמט הערך הוא מספר עשרוני או הקסדצימלי (עם קידומת0x
).כל המזהים הספציפיים לספק מיוצגים על ידי הקידומת
VENDOR_
. לדוגמה,VENDOR_0
עבורVENDOR_START
ו-VENDOR_1
עבורVENDOR_START
ועוד 1. מזהי URI כאלה ספציפיים לחומרה הרדיו שבה הם נוצרו, ואי אפשר להעביר אותם בין מכשירים שיוצרו על ידי יצרני ציוד מקורי שונים.צריך להקצות את מזהי ה-URI האלה לכל MediaItem בתיקיות הרדיו ברמה העליונה. בנוסף, MediaSession חייב לתמוך גם ב-
playFromMediaId
וגם ב-playFromUri
. עם זאת, ה-URI מיועד בעיקר לחילוץ של מטא-נתונים של רדיו (כמו תדר FM) ולאחסון מתמיד. אין ערובה שה-URI יהיה זמין לכל פריטי המדיה (לדוגמה, כשסוג המזהה הראשי עדיין לא נתמך על ידי המסגרת). לעומת זאת, Media ID תמיד פועל. לא מומלץ שלקוחות ישתמשו ב-URI כדי לבחור פריטים מהסשן הנוכחי של MediaBrowser. במקום זאת, צריך להשתמש ב-playFromMediaId
. עם זאת, היא לא אופציונלית לאפליקציה שמוצגת, והחרגות של כתובות URI חסרות נועדו למקרים מוצדקים היטב.בתכנון הראשוני נעשה שימוש בנקודתיים אחת במקום ברצף
://
אחרי חלק התוכנית. עם זאת,android.net.Uri
לא תומך באפשרות הראשונה עבור הפניות URI היררכיות מוחלטות.סוגי מקורות אחרים
אפשר לטפל באופן דומה במקורות אודיו אחרים. לדוגמה, קלט עזר ונגן תקליטורי אודיו.
אפליקציה אחת עשויה להציג מספר סוגי מקורות. במקרים כאלה, מומלץ ליצור MediaBrowserService נפרד לכל סוג מקור. גם בהגדרה עם כמה מקורות מוצגים/MediaBrowserServices, מומלץ מאוד להשתמש ב-MediaSession יחיד באפליקציה אחת.
תקליטור אודיו
בדומה ל-Audio CD, האפליקציה שמציגה את הדיסקים האלה תציג ב-MediaBrowser רשומה אחת שאפשר לעיין בה (או יותר, אם יש במערכת מחליף תקליטורים), שתכלול את כל הטראקים של תקליטור נתון. אם למערכת אין מידע על הטראקים בכל תקליטור (לדוגמה, כשכל הדיסקים מוכנסים לקרטונית בבת אחת והיא לא קוראת את כולם), הערך של MediaItem עבור כל הדיסק יהיה רק
PLAYABLE
, ולאBROWSABLE
וגםPLAYABLE
. אם אין דיסק בחריץ נתון, הערך של הפריט לא יהיהPLAYABLE
אוBROWSABLE
(אבל כל חריץ חייב תמיד להופיע בעץ).הרשומות האלה יסומנו באופן דומה לתיקיות של שידור רדיו, והן יכללו שדות נוספים שהוגדרו ב-MediaDescription API:
EXTRA_CD_TRACK
: לכלMediaItem
ב-CD אודיו, מספר טראק שמתחיל ב-1.EXTRA_CD_DISK
: מספר הדיסק שמתחיל ב-1.
במערכת שתומכת ב-CD-Text ובדיסק תואם, ל-MediaItem ברמה העליונה יהיה שם של הדיסק. באופן דומה, ל-MediaItems של טראקים יהיה שם של הטראק.
קלט עזר
האפליקציה שמספקת קלט עזר חושפת עץ של MediaBrowser עם רשומה אחת (או יותר, אם יש כמה יציאות) שמייצגת את יציאת ה-AUX. אחרי קבלת הבקשה
playFromMediaId
, MediaSession הרלוונטי מקבל את mediaId שלו ומעביר את ההפעלה למקור הזה.לכל רשומה של MediaItem מסוג AUX יהיה שדה נוסף
EXTRA_AUX_PORT_NAME
שמוגדר לשם הלא מותאם של השקע, ללא הביטוי 'AUX'. לדוגמה, הערך של 'AUX 1' יוגדר כ-'1', הערך של 'AUX front' יוגדר כ-'front' והערך של 'AUX' יוגדר כמחרוזת ריקה. בלוקאלים שאינם באנגלית, תג השם יישאר מחרוזת אנגלית זהה. לא סביר, כמו ב-EXTRA_BCRADIO_BAND_NAME_EN
, הערכים מוגדרים על ידי יצרן הציוד המקורי ולא מוגבלים לרשימה מוגדרת מראש.אם החומרה יכולה לזהות מכשירים שמחוברים ליציאת ה-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
- URI של ABC 88.1 (ניתן להפעלה):
broadcastradio://program/RDS_PI/5678?AMFM_FREQUENCY=88100
- URI של ABC 88.1 HD1 (ניתן להפעלה):
broadcastradio://program/HD_STATION_ID_EXT/158241DEADBEEF?AMFM_FREQUENCY=88100&RDS_PI=5678
- URI של ABC 88.1 HD2 (ניתן להפעלה):
broadcastradio://program/HD_STATION_ID_EXT/158242DEADBEFE
- 90.5 FM (ניתן להפעלה) – 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
- URI של BBC One (ניתן להפעלה):
- מועדפים (ניתנים לעיון ולנגינה)
EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_FAVORITES
- URI של BBC One (ניתן להפעלה):
broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=101300
- BBC Two (לא ניתן להפעיל)URI:
broadcastradio://program/RDS_PI/1300?AMFM_FREQUENCY=102100
- URI של BBC One (ניתן להפעלה):
- AM (ניתן לעיון, ניתן להפעלה):
EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="AM"
- URI של 530 AM (ניתן להפעלה):
broadcastradio://program/AMFM_FREQUENCY/530
- URI של 540 AM (ניתן להפעלה):
broadcastradio://program/AMFM_FREQUENCY/540
- URI של 550 AM (ניתן להפעלה):
broadcastradio://program/AMFM_FREQUENCY/550
- URI של 530 AM (ניתן להפעלה):
- FM (ניתן לעיון ולנגינה):
EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="FM"
- 87.7 FM (ניתן להפעלה) URI:
broadcastradio://program/AMFM_FREQUENCY/87700
- URI של 87.9 FM (ניתן להפעלה):
broadcastradio://program/AMFM_FREQUENCY/87900
- 88.1 FM (ניתן להפעלה) URI:
broadcastradio://program/AMFM_FREQUENCY/88100
- 87.7 FM (ניתן להפעלה) URI:
- DAB (ניתן להפעלה):
EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="DAB"
MediaBrowserService של תקליטור אודיו (טפל ב-
ACTION_PLAY_AUDIOCD
):- דיסק 1 (ניתן להפעלה)
EXTRA_CD_DISK=1
- דיסק 2 (ניתן לעיון ולנגינה)
EXTRA_CD_DISK=2
- טראק 1 (ניתן להפעלה)
EXTRA_CD_TRACK=1
- טראק 2 (ניתן להפעלה)
EXTRA_CD_TRACK=2
- טראק 1 (ניתן להפעלה)
- תקליטור המוזיקה שלי (ניתן לעיון ולנגינה)
EXTRA_CD_DISK=3
- All By Myself (ניתן לשחק)
EXTRA_CD_TRACK=1
- Reise, Reise (ניתן להפעלה)
EXTRA_CD_TRACK=2
- All By Myself (ניתן לשחק)
- משבצת 4 ריקה (לא ניתן להפעיל)
EXTRA_CD_DISK=4
AUX MediaBrowserService (טפל ב-
ACTION_PLAY_AUX
):- AUX front (playable)
EXTRA_AUX_PORT_NAME="front"
- AUX אחורי (ניתן להפעלה)
EXTRA_AUX_PORT_NAME="rear"