דף זה מסביר כיצד ליישם רדיו ברמת החומרה והתוכנה.
- רכיבי המערכת ממחישים ומתארים את מחסנית טכנולוגיית הרדיו.
- שכבת אבסטרקציה של חומרת רדיו שידור (HAL) מספקת מבני נתונים וממשקים עבור יצרני OEM ליישם רדיו שידור כגון AM/FM ורדיו שידור אודיו דיגיטלי (DAB) ברמת החומרה.
- הטמעת בקרת רדיו מבוססת על
MediaSession
ו-MediaBrowse
, המאפשרות לאפליקציות מדיה ולעוזר קולי לשלוט ברדיו. בנוסף לתוכן המופיע למטה, ראה בניית אפליקציות מדיה למכוניות .
רכיבי מערכת
ערימת הרדיו השידור כוללת את הרכיבים הבאים.
אפליקציית הפניה לרדיו
לפרטים על אופן הטמעת בקרת רדיו, ראה יישום בקרת רדיו .
אפליקציית רדיו לדוגמא של Java ( packages/apps/Car/Radio
) משמשת כיישום ייחוס. כאשר שירות האפליקציה מתחיל, הוא מבקש ממנהל הרדיו לפתוח מקלט רדיו. לאחר מכן, האפליקציה יכולה לשלוח בקשות אל מקלט הרדיו, כגון כוונון לתחנת רדיו ספציפית, תדר, או לחפש את תחנת הרדיו הזמינה הבאה. האפליקציה מקבלת עדכונים ממנהל הרדיו ומקלט הרדיו ברדיו, כגון מידע על תוכניות נוכחיות, רשימות תוכניות רדיו, תצורות ופרמטרים המוגדרים על ידי הספק. אפליקציית ה-Reference Radio תומכת רק ברדיו AM ו-FM. יצרני OEM יכולים לשנות או להחליף את אפליקציית הרדיו לפי הצורך.
מנהל רדיו
כאשר האפליקציה מבקשת מ-Radio Manager לפתוח מקלט, מנהל הרדיו ( frameworks/base/core/java/android/hardware/radio/RadioManager.java
) מבקש משירות הרדיו השידור לפתוח סשן של טיונר ולאחר מכן עוטף את ההפעלה ב- Radio Tuner ( frameworks/base/core/java/android/hardware/radio/RadioTuner.java
), המוחזר לאפליקציה. מקלט הרדיו מגדיר ממשקי API (כגון כוונון, צעד וביטול) שניתן לקרוא להם מאפליקציות רדיו ולשלוח בקשות לשירות רדיו שידור. שיטות התקשרות חוזרת ( RadioTuner.Callback
) המוגדרות ב- Radio Tuner שולחות עדכונים לגבי הרדיו HAL המשודר, כגון מידע תוכניות עדכני, רשימות תוכניות ופרמטרים המוגדרים על ידי הספק, משירות הרדיו השידור לאפליקציות.
שירות רדיו שידור
שירות רדיו השידור ( frameworks/base/services/core/java/com/android/server/broadcastradio
) הוא שירות הלקוחות של Broadcast Radio HAL. שירות רדיו השידור מתאם מספר מנהלי רדיו עם HALs של רדיו שידור. שירות רדיו השידור תומך בשפת הגדרת ממשק HAL (HIDL) ושפת הגדרות ממשק אנדרואיד (AIDL) שידורי רדיו HAL. שירות רדיו השידור מקשר ל-AIDL HAL כאשר קיים שירות AIDL HAL כלשהו; אחרת, השירות מקשר ל-HIDL HAL. שירות הרדיו השידור יוצר מודול רדיו עבור כל מופע HAL זמין (כגון AM, FM ו-DAB).
כל מנהל רדיו יכול לבקש משירות הרדיו השידור ליצור הפעלת טיונר במודול הרדיו המתאים, בהתבסס על סוג הרדיו. כל הפעלת טיונר יכולה לקרוא לשיטות, כגון כוונון, צעד וביטול (מוגדרים בממשקי HAL) כדי לבצע פעולות על מופע הרדיו השידור המתאים. כאשר הפעלת טיונר אחת מקבלת התקשרות חוזרת ממופע HAL על עדכון HAL, כגון מידע תוכנית נוכחי, רשימת תוכניות, דגלי תצורה ופרמטרים של ספקים, התקשרויות חוזרות לגבי העדכון נשלחות לכל מקלטי הרדיו המקושרים לאותו מודול רדיו.
שידור רדיו HAL
למידע נוסף על ממשקי HIDL ו-AIDL של רדיו שידור וההבדלים בין השניים, ראה ממשק רדיו שידור HAL .
שכבת הפשטה של חומרת רדיו שידור
הסעיפים הבאים מתארים כיצד לעבוד עם שכבת הפשטת החומרה (HAL) כדי ליישם רדיו שידור.
ממשק רדיו שידור HAL
רדיו השידור HAL מספק מבני נתונים וממשקים ברמת החומרה ליישום רדיו שידור, כגון רדיו AM/FM ו-DAB.
ממשקי HIDL 2.0 ו-AIDL
רדיו השידור HAL משתמש בממשקים המתוארים בסעיפים הבאים.
מאזין הודעה
IAnnouncementListener
הוא ממשק ההתקשרות לאחור עבור מאזין ההכרזה, אותו ניתן לרשום ברדיו השידור HAL לקבלת הודעות. לממשק יש את השיטות הבאות:
IAnnouncementListener | ||
---|---|---|
תיאור: מתקשרים בכל פעם שרשימת ההודעות השתנתה. | ||
HIDL 2.0 | oneway onListUpdated(vec<Announcement> announcements) | |
איידל | oneway void onListUpdated(in Announcement[] announcements) |
סגור ידית
ICloseHandle
היא ידית הסגירה הגנרית להסרת התקשרות חוזרת שאינה זקוקה לממשק פעיל.
ICloseHandle | ||
---|---|---|
תיאור: סגור את הידית. | ||
HIDL 2.0 | close() | |
איידל | void close() |
ממשק התקשרות חוזרת
ITunerCallback
הוא ממשק ההתקשרות חזרה שנקרא על ידי רדיו השידור HAL כדי לשלוח עדכונים לשירות הלקוחות של HAL.
ITunerCallback | ||
---|---|---|
תיאור: נקרא על ידי ה-HAL כאשר פעולת כוונון (כוונון, חיפוש (ב-AIDL) או סריקה (ב-HIDL) והצעד מצליח) נכשלת באופן אסינכרוני. | ||
HIDL 2.0 | oneway onCurrentProgramInfoChanged(ProgramInfo info) | |
איידל | void onCurrentProgramInfoChanged(in ProgramInfo info) | |
תיאור: נקרא כאשר המכוון, החיפוש (ב-AIDL) או סריקה (ב-HIDL), או הצעד מצליח. | ||
HIDL 2.0 | oneway onTuneFailed(Result result, ProgramSelector selector) | |
איידל | void onTuneFailed(in Result result, in ProgramSelector selector) | |
תיאור: נקרא כאשר המכוון, החיפוש (ב-AIDL) או סריקה (ב-HIDL), או הצעד מצליח. | ||
HIDL 2.0 | oneway onCurrentProgramInfoChanged(ProgramInfo info) | |
איידל | void onCurrentProgramInfoChanged(in ProgramInfo info) | |
תיאור: נקרא כאשר רשימת התוכניות מתעדכנת; יש להגביל את הגודל של כל נתח ל-500kiB. | ||
HIDL 2.0 | oneway onProgramListUpdated(ProgramListChunk chunk) | |
איידל | oneway onProgramListUpdated(ProgramListChunk chunk) | |
תיאור: נקרא כאשר האנטנה מחוברת או מנותקת. | ||
HIDL 2.0 | oneway onAntennaStateChange(bool connected) | |
איידל | void onCurrentProgramInfoChanged(in ProgramInfo info) | |
תיאור: נקרא כאשר ערכי הפרמטרים הספציפיים לספק מתעדכנים באופן פנימי ב-HAL (אין להפעיל אותם לאחר קריאה setParameters על ידי לקוח HAL). | ||
HIDL 2.0 | oneway onParametersUpdated(vec<VendorKeyValue> parameters) | |
איידל | void onParametersUpdated(in VendorKeyValue[] parameters) | |
תיאור: חדש ב-AIDL. נקרא כאשר דגל התצורה מתעדכן באופן פנימי ב-HAL (אין להפעיל אותו לאחר קריאת setConfigFlag על ידי לקוח HAL). | ||
HIDL 2.0 | לא ישים. | |
איידל | void onConfigFlagUpdated(in ConfigFlag flag, in boolean value) |
ממשק רדיו שידור ראשי HAL
IBroadcastRadio
הוא הממשק העיקרי של רדיו השידור HAL. ב-HIDL 2.0 HAL, השתמש בממשק ITunerSession
לטיונר כדי לקרוא לפעולות. עם זאת, לכל היותר מקלט אחד פעיל בו-זמנית (בתנאי שלכל מופע רדיו HAL משודר יש רק שבב טיונר אחד). ITunerSession
הוסר מממשקי ה-AIDL והממשקים שלו הועברו ל- IBroadcastRadio
.
IbroadcastRadio | ||
---|---|---|
תיאור: קבל את התיאור של מודול ויכולותיו. | ||
HIDL 2.0 | getProperties() generates (Properties properties) | |
איידל | Properties getProperties() | |
תיאור: שואב את התצורה הנוכחית או האפשרית של אזור AM/FM. | ||
HIDL 2.0 | getAmFmRegionConfig(bool full) generates (Result result, AmFmRegionConfig config) | |
איידל | AmFmRegionConfig getAmFmRegionConfig(bool full) | |
תיאור: שואב את תצורת אזור ה-DAB הנוכחית. | ||
HIDL 2.0 | getDabRegionConfig() generates (Result result, vec<DabTableEntry> config) | |
איידל | DabTableEntry[] getDabRegionConfig() | |
תיאור: מקבל תמונה ממטמון מודול הרדיו. ב-AIDL, גודל התמונה חייב להיות פחות מ-1MB עקב מגבלה קשה על מאגר העסקאות של הקלסר. | ||
HIDL 2.0 | getImage(uint32_t id) generates (vec<uint8_t> image) | |
איידל | byte[] getImage(in int id) | |
תיאור: רושם את מאזין ההכרזה. | ||
HIDL 2.0 | registerAnnouncementListener(vec<AnnouncementType> enabled,IAnnouncementListener listener) generates (Result result, ICloseHandle closeHandle) | |
איידל | ICloseHandle registerAnnouncementListener(in IAnnouncementListener listener, in AnnouncementType[] enabled) | |
תיאור:
| ||
HIDL 2.0 | openSession(ITunerCallback callback) יוצר (Result result, ITunerSession session) | |
איידל | void setTunerCallback(in ITunerCallback callback) | |
תיאור:
| ||
HIDL 2.0 | close() | |
איידל | unsetTunerCallback() | |
תיאור: מכוון לתוכנית מוגדרת. | ||
HIDL 2.0 | tune(ProgramSelector program) generates (Result result) | |
איידל | void tune(in ProgramSelector program) | |
תיאור: מחפש את התוכנית התקינה הבאה בשידור . כדי למנוע בלבול ב-AIDL, scan שונה ל- seek . | ||
HIDL 2.0 | scan(bool directionUp, bool skipSubChannel) generates (Result result) | |
איידל | void seek(in boolean directionUp, in boolean skipSubChannel) | |
תיאור: שלבים לערוץ הסמוך, שאולי לא תפוס על ידי תוכנית כלשהי. | ||
HIDL 2.0 | step(bool directionUp) generates (Result result) | |
איידל | void step(in boolean directionUp) | |
תיאור: מבטל פעולות ניגון ממתין, סריקה (ב-HIDL) או חיפוש (ב-AIDL), או צעדים. | ||
HIDL 2.0 | cancel() | |
איידל | void cancel() | |
תיאור: מחיל מסנן על רשימת התוכניות ומתחיל לשלוח עדכוני רשימת תוכניות על פני התקשרות חוזרת onProgramListUpdated . | ||
HIDL 2.0 | startProgramListUpdates(ProgramFilter filter) generates (Result result) | |
איידל | void startProgramListUpdates(in ProgramFilter filter) | |
תיאור: מפסיק לשלוח עדכוני רשימת תוכניות. | ||
HIDL 2.0 | stopProgramListUpdates() | |
איידל | void stopProgramListUpdates() | |
תיאור: שואב את ההגדרה הנוכחית של דגל תצורה נתון. | ||
HIDL 2.0 | isConfigFlagSet(ConfigFlag flag) generates (Result result, bool value) | |
איידל | boolean isConfigFlagSet(in ConfigFlag flag) | |
תיאור: מגדיר את דגל התצורה הנתון. | ||
HIDL 2.0 | setConfigFlag(ConfigFlag flag, bool value) generates (Result result) | |
איידל | void setConfigFlag(in ConfigFlag flag, boolean value) | |
תיאור: מגדיר ערכי פרמטר ספציפיים לספק. | ||
HIDL 2.0 | setParameters(vec<VendorKeyValue> parameters) מייצר , (vec<VendorKeyValue> results) | |
איידל | VendorKeyValue[] setParameters(in VendorKeyValue[] parameters) | |
תיאור: מאחזר ערכי פרמטר ספציפיים לספק. | ||
HIDL 2.0 | getParameters(vec<string> keys) generates (vec<VendorKeyValue> parameters) | |
איידל | VendorKeyValue[] getParameters(in String[] keys) |
הבהרות ממשק
התנהגות אסינכרונית
מכיוון שכל פעולת כוונון (לדוגמה, כוונון, סריקה (ב-HIDL) או חיפוש (ב-AIDL) ושלב) עשויה להיות גוזלת זמן ואין לחסום את השרשור למשך זמן רב, הפעולה צריכה לתזמן פעולות גוזלות זמן להתרחש מאוחר יותר ולהחזיר במהירות סטטוס או תוצאה. בפירוט, כל פעולה צריכה:
- בטל את כל פעולות הכוונון הממתינות.
- בדוק אם ניתן לעבד את הפעולה בהתבסס על כניסות השיטה והסטטוס של הטיונר.
- תזמן את משימת הכוונון ולאחר מכן החזר את
Result
(ב-HIDL) אוstatus
(ב-AIDL) באופן מיידי. אםResult
אוstatus
OK
, יש לקרוא ל-CallbacktuneFailed
אוcurrentProgramInfoChanged
כאשר משימת הכוונון נכשלה (לדוגמה, עקב פסק זמן) או הושלמה.
באופן דומה, startProgramListUpdates
גם מתזמן את המשימה שגוזלת זמן של עדכון רשימת התוכניות להתבצע מאוחר יותר ולהחזיר במהירות סטטוס או תוצאה. השיטה תחילה מבטלת בקשות עדכון ממתינות ולאחר מכן מתזמנת את משימת העדכון ומחזירה במהירות את התוצאה.
מצב Race
עקב ההתנהגות הא-סינכרונית של פעולות כוונון (לדוגמה, כוונון, סריקה (ב-HIDL) או חיפוש (ב-AIDL), ושלב), קיים מצב מירוץ בין ביטול הפעולה לבין פעולות הכוונון. אם cancel
נקרא לאחר שה-HAL משלים פעולת כוונון ולפני השלמת ההתקשרות, ניתן להתעלם מהביטול וההתקשרות חזרה אמורה להסתיים ולהתקבל על ידי לקוח HAL.
באופן דומה, אם מתקשרים stopProgramListUpdates
לאחר שה-HAL משלים עדכון של רשימת תוכניות ולפני שההתקשרות חוזרת onCurrentProgramInfoChanged
מסתיימת, ניתן להתעלם stopProgramListUpdates
ולהסתיים ההתקשרות חזרה.
מגבלת גודל נתונים
מכיוון שקיימת מגבלה קשה על מאגר עסקאות הקלסר, מגבלת הנתונים עבור שיטות ממשק מסוימות המעבירות נתונים בגודל פוטנציאלי גדול מובהרת ב-AIDL HAL.
-
getImage
דורש שהתמונה תוחזר פחות מ-1 MB. -
onProgramListUpdate
דורש שכלchunk
יהיה פחות מ-500kiB. יש לפצל רשימות תוכניות גדולות יותר על ידי יישום HAL למספר נתחים ולשלוח באמצעות מספר התקשרויות חוזרות.
שינויים במבני נתונים של AIDL HAL
בנוסף לשינויים בממשקים, שינויים אלו הוחלו על מבני הנתונים המוגדרים ברדיו השידור AIDL HAL, המנצל את ה-AIDL.
- Enum
Constant
מוסר ב-AIDL ומוגדר כ-const int ב-IBroadcastRadio
. בינתיים, השםANTENNA_DISCONNECTED_TIMEOUT_MS
שונה ל-ANTENNA_STATE_CHANGE_TIMEOUT_MS
. נוספה קבועה חדשהTUNER_TIMEOUT_MS
. יש להשלים את כל פעולות הכיוון, החיפוש והשלבים תוך זמן זה. - Enum
RDS
ו-Deemphasis
מוסרים ב-AIDL ומוגדרים כ-const int ב-AmFmRegionConfig
. בהתאם, הןfmDeemphasis
והןfmRds
ב-ProgramInfo
מוכרזים כ-int, תוצאת חישוב ביט של הדגלים המתאימים. בינתיים, שמםD50
ו-D75
שונה ל-DEEMPHASIS_D50
ו-DEEMPHASIS_D75
, בהתאמה. - Enum
ProgramInfoFlags
מוסרים ב-AIDL ומוגדרים כ-const int ב-ProgramInfo
עם קידומתFLAG_
שנוספה. בהתאם,infoFlags
ב-ProgramInfo
מוכרז כ-int, תוצאת חישוב של דגלים.TUNED
שונה גם ל-FLAG_TUNABLE
, כדי לתאר טוב יותר את ההגדרה שלה שניתן לכוון את התחנה. - ב-
AmFmBandRange
, השםscanSpacing
שונה ל-seekSpacing
, מכיוון ששםscan
שונה ל-seek
ב-AIDL. - מכיוון שמושג האיחוד מוצג ב-AIDL, אין עוד שימוש
MetadataKey
וב-Metadata
המוגדרים ב-HIDL HAL.Metadata
של איגוד AIDL מוגדרים ב- AIDL HAL. כל ערך enum בעבר ב-MetadataKey
הוא כעת שדה ב-Metadata
עם סוג מחרוזת או int, בהתאם להגדרות שלהם.
יישום בקרת רדיו
הטמעת בקרת רדיו מבוססת על MediaSession
ו- MediaBrowse
, המאפשרות לאפליקציות מדיה ולעוזר קולי לשלוט ברדיו. למידע נוסף, ראה בניית אפליקציות מדיה למכוניות ב-Developer.android.com.
מימוש עץ עיון במדיה מסופק בספריית התמיכה ב-car-broadcastradio 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" או "הפעל רדיו". -
onPlayFromUri
. נגן בתדר מסוים. לדוגמה, "הפעל 88.5 FM." -
onSkipToNext
,onSkipToPrevious
. כוון לתחנה הבאה או קודמת. -
onSetRating
. הוסף או הסר אל או ממועדפים.
MediaBrowser חושף פריט מדיה שניתן לכוונן על פני שלושה סוגים של ספריות ברמה העליונה:
- ( אופציונלי ) תוכניות (תחנות). מצב זה משמש בדרך כלל על ידי מכשירי רדיו כפולים כדי לציין את כל תחנות הרדיו הזמינות הניתנות לכיוונון במיקום המשתמש.
- מועדפים. תוכניות רדיו נוספו לרשימת המועדפים, חלקן עשויות להיות לא זמינות (מחוץ לטווח קליטה).
- ערוצי להקה. כל הערוצים האפשריים פיזית באזור הנוכחי (87.9, 88.1, 88.3, 88.5, 88.7, 88.9, 89.1 וכן הלאה). לכל להקה יש ספרייה נפרדת ברמה העליונה.
כל אלמנט בכל אחת מהתיקיות הללו (AM/FM/Programs) הוא MediaItem עם URI שניתן להשתמש בו עם MediaSession כדי לכוונן. כל תיקיה ברמה העליונה (AM/FM/Programs) היא פריט מדיה עם זיהוי מדיה שניתן להשתמש בו עם MediaSession כדי להפעיל השמעה, והוא נתון לשיקול דעתו של ה-OEM. לדוגמה, "הפעל FM", "הפעל AM" ו-"הפעל רדיו" הן כולן שאילתות רדיו לא ספציפיות המשתמשות במזהה מדיה כדי לשלוח לאפליקציית הרדיו של OEM. אפליקציית הרדיו תחליט מה להשמיע מהבקשה הגנרית ומה-mediaId.
MediaSession
בהינתן שאין מושג של השהיית זרם שידור, הפעולות הפעל, השהה ועצירה לא תמיד חלות על רדיו. ברדיו, פעולת העצירה משויכת להשתקת הזרם בעוד שההפעלה משויכת להסרת ההשתקה.
מקלטי רדיו מסוימים (או אפליקציות) מספקים את היכולת לדמות הפסקת זרם שידור על ידי שמירת תוכן במטמון ואז השמעתו מאוחר יותר. במקרים כאלה, השתמש onPause
.
הפעלה מפעולות mediaId ו-URI נועדה לכוונן לתחנה שנשלפת מממשק MediaBrowser. ה-mediaId הוא מחרוזת שרירותית שמסופקת על ידי אפליקציית הרדיו כדי להטיל ערך ייחודי (כך שמזהה נתון מצביע על פריט אחד בלבד) ויציב (לכן לפריט נתון יש אותו מזהה לאורך כל הפגישה) שבאמצעותו ניתן לזהות תחנה נתונה . ה-URI יהיה בעל סכימה מוגדרת היטב. בקיצור, צורה מבוססת URI של ProgramSelector. זה אמנם שומר על תכונת הייחוד, אבל היא לא חייבת להיות יציבה, למרות שהיא יכולה להשתנות כאשר התחנה עוברת לתדר אחר.
לפי התכנון, לא נעשה שימוש onPlayFromSearch
. באחריות הלקוח (האפליקציה הנלווית) לבחור תוצאת חיפוש מעץ MediaBrowser. העברת האחריות לאפליקציית הרדיו תגביר את המורכבות, ידרוש חוזים רשמיים לגבי האופן שבו שאילתות מחרוזות צריכות להופיע, ויגרום לחוויית משתמש לא אחידה בפלטפורמות חומרה שונות.
הערה: אפליקציית הרדיו אינה מכילה מידע נוסף שיועיל לחיפוש שם תחנה שלא נחשף ללקוח דרך ממשק MediaBrowser.
דילוג לתחנה הבאה או הקודמת תלוי בהקשר הנוכחי:
- כאשר אפליקציה מכוונת לתחנה מרשימת המועדפים, האפליקציה יכולה לעבור לתחנה הבאה מרשימת המועדפים.
- האזנה לתחנה מרשימת התוכניות עשויה לגרום לכוונון לתחנה הזמינה הבאה, ממוינת לפי מספר הערוץ.
- האזנה לערוץ שרירותי עלולה לגרום לכוונון לערוץ הפיזי הבא, גם כאשר אין אות שידור.
אפליקציית הרדיו מטפלת בפעולות אלו.
טיפול בשגיאות
פעולות TransportControls
(הפעל, עצור והבא) אינן מספקות משוב אם הפעולה מצליחה או לא. הדרך היחידה לציין שגיאה היא להגדיר את מצב MediaSession ל- STATE_ERROR
עם הודעת שגיאה.
אפליקציית הרדיו חייבת לטפל בפעולות הללו ולבצע אותן או להגדיר מצב שגיאה. אם ביצוע פקודת ההפעלה אינו מיידי, יש לשנות את מצב ההשמעה ל- STATE_CONNECTING
(במקרה של כוונון ישיר) או STATE_SKIPPING_TO_PREVIOUS
או NEXT
בזמן שהפקודה מבוצעת.
על הלקוח לצפות ב- PlaybackState
ולוודא שההפעלה שינתה את התוכנית הנוכחית למה שהתבקש או הוכנס למצב השגיאה. STATE_CONNECTING
לא יעלה על 30 שניות. עם זאת, כוונון ישיר לתדר AM/FM נתון אמור לבצע הרבה יותר מהר.
הוסף והסר מועדפים
ל-MediaSession יש תמיכה בדירוג, שבה ניתן להשתמש כדי לשלוט במועדפים. onSetRating
שנקרא עם דירוג מסוג RATING_HEART
מוסיף או מסיר את התחנה המכווננת כעת אל או מרשימת המועדפים.
בניגוד להגדרות מדור קודם, מודל זה מניח רשימת מועדפים לא מסודרת ובלתי מוגבלת, כאשר כל מועדף שמור הוקצה למשבצת מספרית (בדרך כלל, 1 עד 6). כתוצאה מכך, מערכות מבוססות מראש לא יהיו תואמות לפעולת onSetRating
.
המגבלה של ה-API של MediaSession היא שניתן להוסיף או להסיר רק את התחנה המכווננת אליה. לדוגמה, תחילה יש לבחור פריטים לפני שניתן להסירם. זוהי רק מגבלה של לקוח MediaBrowser, כגון אפליקציה נלווית. אפליקציית הרדיו אינה מוגבלת באופן דומה. חלק זה הוא אופציונלי כאשר אפליקציה לא תומכת במועדפים.
MediaBrowser
כדי לבטא אילו תדרים או שמות ערוצים פיזיים (כאשר כוונון לערוץ שרירותי מתאים לטכנולוגיית רדיו נתונה) תקפים לאזור נתון, כל הערוצים (התדרים) התקפים רשומים עבור כל פס. באזור ארה"ב, זה מסתכם ב-101 ערוצי FM בטווח של 87.8 עד 108.0 מגה-הרץ (בשימוש במרווח של 0.2 מגה-הרץ) ו-117 ערוצי AM בטווח של 530 עד 1700 קילו-הרץ (באמצעות מרווח של 10 קילו-הרץ). מכיוון שרדיו HD משתמש באותו שטח ערוץ, הוא אינו מוצג בנפרד.
רשימת תוכניות הרדיו הזמינות כרגע היא שטוחה בכך שהיא אינה מאפשרת תוכניות תצוגה כגון קיבוץ לפי אנסמבל שידור אודיו ישיר (DAB).
ייתכן שלא ניתן יהיה לכוונן ערכים ברשימת המועדפים. למשל אם תוכנית נתונה מחוץ לטווח. אפליקציית הרדיו עשויה לזהות או לא לזהות אם ניתן לכוון את הערך מראש. אם כן, ייתכן שהוא לא יסמן את הערך כאפשר לשחק.
כדי לזהות תיקיות ברמה העליונה, מוחל אותו מנגנון המשמש את Bluetooth. כלומר, חבילת Extras של אובייקט 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).
MediaDescription.getTitle
. - תדר FM. URI (ראה ProgramSelector ) או
MediaDescription.getTitle
(אם ערך נמצא בתיקייהBROADCASTRADIO_FOLDER_TYPE_BAND
). - מזהים ספציפיים לרדיו (RDS PI, DAB SId).
MediaDescription.getMediaUri
מנותח ל-ProgrammeSelector.
בדרך כלל, אין צורך להביא תדר FM עבור ערך בתוכנית הנוכחית או ברשימת המועדפים (כיוון שהלקוח צריך לפעול על מזהי מדיה). עם זאת, אם יתעורר צורך כזה (לדוגמה, למטרות תצוגה), הוא קיים ב-URI וניתן לנתח אותו אל
ProgramSelector
. עם זאת, לא מומלץ להשתמש ב-URI לבחירת פריטים בהפעלה הנוכחית. לפרטים, ראהProgramSelector
.כדי להימנע מבעיות הקשורות לביצועים או לקלסר, שירות MediaBrowser חייב לתמוך בעימוד:
-
EXTRA_PAGE
-
EXTRA_PAGE_SIZE
- פרמטרים נוספים עבור
subscribe()
הערה: כברירת מחדל, העימוד מיושם כברירת מחדל בגרסה
onLoadChildren()
ללא טיפול באפשרויות.לערכים קשורים מכל סוגי הרשימות (ערוצים גולמיים, תוכניות שנמצאו ומועדפים) עשויים להיות מזהי מדיה שונים (זה תלוי באפליקציית הרדיו; בספריית התמיכה יהיו שונים). URIs (בצורת ProgramSelector) נבדלים בין ערוצים גולמיים ותכניות שנמצאו ברוב המקרים (למעט FM ללא RDS), אך הם לרוב זהים בין תוכניות שנמצאו למועדפים (למעט, למשל, כאשר AF עודכן).
שימוש במזהי מדיה שונים עבור ערכים מסוגים שונים של רשימות מאפשר לבצע פעולות שונות לגביהם. אתה יכול לעבור בין רשימת המועדפים או רשימת כל התוכניות ב-
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 .אם האפליקציה הספציפית למקור (לדוגמה, אפליקציית רדיו) מותקנת במכשיר ללא תמיכת מקור כזו, היא עדיין תפרסם את עצמה כמטפלת בכוונת
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.
כוונות משחק כלליות
כל אפליקציה המיועדת להשמעת מקור נתון (כמו רדיו או תקליטור) חייבת להתמודד עם כוונת הפעלה כללית כדי להתחיל לנגן תוכן כלשהו, אולי ממצב לא פעיל (לדוגמה, לאחר האתחול). זה תלוי באפליקציה איך לבחור תוכן להשמעה, אבל זה בדרך כלל תוכנית הרדיו שהושמעה לאחרונה או רצועת התקליטורים. ישנה כוונה נפרדת המוגדרת לכל מקור שמע:
-
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 (ייתכן שהוא תקליטור במצב מעורב) -
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
: אחסון מדיה מקומי (פלאש מובנה)
כוונות נבחרו לשמש לפיקוד משחק כללי, מכיוון שהן פותרות שתי בעיות בבת אחת: פקודת המשחק הכללית עצמה וגילוי שירות. יתרון נוסף של כוונה כזו תהיה אפשרות לבצע פעולה פשוטה כזו מבלי לפתוח את הפעלת MediaBrowser.
גילוי שירות הוא למעשה הבעיה החשובה יותר שנפתרה עם כוונות אלו. הליך גילוי השירות קל וחד משמעי בדרך זו (ראה גילוי וחיבור שירות ).
כדי להקל על כמה יישומי לקוח, ישנה דרך חלופית להנפיק פקודת הפעלה כזו (שיש ליישם אותה גם על ידי אפליקציית הרדיו): הנפקת
playFromMediaId
עם ה-rootId של צומת השורש (המשמש כ-mediaId). בעוד שצומת השורש לא אמור להיות ניתן להשמעה, ה-rootId שלו הוא מחרוזת שרירותית שניתן להפוך אותה לצריכה כ-mediaId. עם זאת, לקוחות אינם נדרשים להבין ניואנס זה.בורר תוכניות
בעוד ש-
mediaId
מספיק כדי לבחור ערוץ מ-MediaBrowserService
, הוא הופך להיות קשור להפעלה ולא עקבי בין ספקים. במקרים מסוימים הלקוח עשוי להזדקק למצביע מוחלט (כגון תדירות מוחלטת) כדי לשמור עליו בין הפעלות למכשירים.בעידן שידורי הרדיו הדיגיטליים, תדר חשוף אינו מספיק כדי לכוון לתחנה ספציפית. לכן, השתמש
ProgramSelector
כדי לכוונן לערוץ אנלוגי או דיגיטלי.ProgramSelector
מורכב משני חלקים:- מזהה ראשי. מזהה ייחודי ויציב לתחנת רדיו נתונה שאינו משתנה אך עשוי שלא להספיק כדי לכוונן לתחנה זו. לדוגמה, קוד RDS PI, שעשוי להיות מתורגם לסימן הקריאה בארה"ב.
- מזהים משניים. מזהים נוספים שימושיים לכיוונון לתחנה זו (לדוגמה, תדר), אולי כולל מזהים מטכנולוגיות רדיו אחרות. לדוגמה, לתחנת 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 host) של
program
מספק מקום להרחבת סכימה בעתיד. מחרוזות סוג המזהה מצוינות במדויק כשמותיהן בהגדרת HAL 2.x שלIdentifierType
ופורמט הערך הוא מספר עשרוני או הקסדצימלי (עם קידומת0x
).כל המזהים הספציפיים לספק מיוצגים על ידי הקידומת
VENDOR_
. לדוגמה,VENDOR_0
עבורVENDOR_START
ו-VENDOR_1
עבורVENDOR_START
פלוס 1. URIs כאלה הם ספציפיים לחומרת הרדיו שבה הם נוצרו ולא ניתן להעביר אותם בין מכשירים שיוצרו על ידי יצרני OEM שונים.יש להקצות URIs אלה לכל פריט מדיה תחת תיקיות הרדיו ברמה העליונה. בנוסף, MediaSession חייבת לתמוך גם
playFromMediaId
וגםplayFromUri
. עם זאת, ה-URI מיועד בעיקר לחילוץ מטא נתונים רדיו (כגון תדר FM) ואחסון מתמשך. אין ערובה שה-URI יהיה זמין עבור כל פריטי המדיה (לדוגמה, כאשר סוג המזהה הראשי עדיין לא נתמך על ידי המסגרת). מצד שני, Media ID תמיד עובד. לא מומלץ ללקוחות להשתמש ב-URI כדי לבחור פריטים מההפעלה הנוכחית של MediaBrowser. במקום זאת, השתמשplayFromMediaId
. עם זאת, זה לא אופציונלי עבור אפליקציית ההגשה ו-URI חסרים שמורים למקרים מוצדקים היטב.העיצוב הראשוני השתמש בנקודתיים בודדת במקום ברצף
://
לאחר חלק הסכמה. עם זאת, הראשון אינו נתמך על ידיandroid.net.Uri
עבור הפניות URI היררכיות מוחלטות.סוגי מקור אחרים
ניתן לטפל במקורות שמע אחרים באופן דומה. לדוגמה, קלט עזר ונגן תקליטורים אודיו.
אפליקציה בודדת עשויה לשרת מספר סוגים של מקורות. במקרים כאלה, מומלץ ליצור MediaBrowserService נפרד עבור כל סוג מקור. אפילו במערך עם מספר מקורות / MediaBrowserServices, מומלץ מאוד לקיים MediaSession בודד בתוך אפליקציה אחת.
תקליטור שמע
דומה ל- Audio CD בכך שהאפליקציה שמשרתת דיסקים כאלה תחשוף את MediaBrowser עם ערך יחיד שניתן לדפדף בו (או יותר, אם למערכת יש מחליף CD), שבתורו יכיל את כל הרצועות של תקליטור נתון. אם למערכת אין את הידע על הרצועות בכל תקליטור (לדוגמה, כאשר כל הדיסקים מוכנסים למחסנית בבת אחת והיא לא קוראת את כולם), אז MediaItem עבור כל הדיסק יהיה רק
PLAYABLE
, לאBROWSABLE
בתוספתPLAYABLE
. אם אין דיסק בחריץ נתון, הפריט לא יהיהPLAYABLE
ולאBROWSABLE
(אבל כל משבצת חייבת להיות קיימת תמיד בעץ).ערכים אלה יסומנו באופן דומה לזה של תיקיות רדיו שידור; הם יכילו שדות נוספים המוגדרים בממשק ה-API של MediaDescription:
-
EXTRA_CD_TRACK
: עבור כלMediaItem
בתקליטור שמע, מספר רצועה מבוססת 1. -
EXTRA_CD_DISK
: מספר דיסק מבוסס 1.
עבור מערכת התומכת בתקליטור ודיסק תואם, ל-MediaItem ברמה העליונה תהיה כותרת של הדיסק. באופן דומה, ל-MediaItems עבור רצועות תהיה כותרת של הרצועה.
קלט עזר
האפליקציה המשרתת קלט עזר חושפת עץ MediaBrowser עם כניסה בודדת (או יותר, כאשר קיימות מספר יציאות) המייצגת את ה-AUX ביציאה. MediaSession המתאים לוקח את ה-mediaId שלו ועובר למקור זה לאחר קבלת בקשת
playFromMediaId
.לכל ערך AUX MediaItem יהיה שדה נוסף
EXTRA_AUX_PORT_NAME
המוגדר בשם הלא-ממוקם של היציאה ללא הביטוי "AUX". לדוגמה, "AUX 1" היה מוגדר ל-"1", "AUX front" ל-"front" ו-"AUX" למחרוזת ריקה. באזורים שאינם אנגלית, תג השם יישאר באותו מחרוזת אנגלית. לא סביר כמוEXTRA_BCRADIO_BAND_NAME_EN
, הערכים מוגדרים OEM ולא מוגבלים לרשימה מוגדרת מראש.אם החומרה יכולה לאתר מכשירים המחוברים ליציאת AUX, החומרה צריכה לסמן את ה- MediaItem כניתן
PLAYABLE
, רק אם הקלט מחובר. עדיין יש למנות את החומרה (אך לאPLAYABLE
) אם שום דבר לא היה מחובר ליציאה זו. אם לחומרה אין יכולת כזו, על המדיה תמיד להיות מוגדרת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"
הלקוח צריך לבדוק את המדיה המדיה ברמה העליונה עבור אלמנטים עם
EXTRA_CD_DISK
אוEXTRA_AUX_PORT_NAME
שדה שדה נוסף.דוגמאות מפורטות
הדוגמאות הבאות מתייחסות למבנה העץ MediaBrowser עבור סוגי מקור שהם חלק מתכנון זה.
שידור רדיו MediaBrowserserservice (Handles
ACTION_PLAY_BROADCASTRADIO
):- תחנות (ניתן לגלישה)
EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_PROGRAMS
- BBC ONE (ניתן לשחק) URI:
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.5 FM (ניתן לשחק) - FM ללא rdsuri:
broadcastradio://program/AMFM_FREQUENCY/90500
- 620 בבוקר (ניתן לשחק) URI:
broadcastradio://program/AMFM_FREQUENCY/620
- BBC ONE (ניתן לשחק) URI:
broadcastradio://program/DAB_SID_EXT/1E24102?RDS_PI=1234
- BBC ONE (ניתן לשחק) URI:
- מועדפים (ניתן לגלישה, ניתנת לשחק)
EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_FAVORITES
- BBC One (ניתן לשחק) URI:
broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=101300
- BBC שני (לא ניתן לשחק) URI:
broadcastradio://program/RDS_PI/1300?AMFM_FREQUENCY=102100
- BBC One (ניתן לשחק) URI:
- AM (ניתן לגלישה, ניתן לשחק):
EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="AM"
- 530 בבוקר (ניתן לשחק) URI:
broadcastradio://program/AMFM_FREQUENCY/530
- 540 בבוקר (ניתן לשחק) URI:
broadcastradio://program/AMFM_FREQUENCY/540
- 550 בבוקר (ניתן לשחק) URI:
broadcastradio://program/AMFM_FREQUENCY/550
- 530 בבוקר (ניתן לשחק) URI:
- FM (ניתן לגלישה, ניתן לשחק):
EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="FM"
- 87.7 FM (ניתן לשחק) URI:
broadcastradio://program/AMFM_FREQUENCY/87700
- 87.9 FM (ניתן לשחק) URI:
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"
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
- מסלול 1 (ניתן לשחק)
- תקליטור המוזיקה שלי (ניתן לגלישה, ניתן להפעלה)
EXTRA_CD_DISK=3
- הכל לבד (ניתן לשחק)
EXTRA_CD_TRACK=1
- רייז, רייז (ניתן לשחק)
EXTRA_CD_TRACK=2
- הכל לבד (ניתן לשחק)
- חריץ ריק 4 (לא ניתן לשחק)
EXTRA_CD_DISK=4
Aux mediabrowserservice (מטפל
ACTION_PLAY_AUX
):- AUX Front (ניתן לשחק)
EXTRA_AUX_PORT_NAME="front"
- AUX אחורי (ניתן לשחק)
EXTRA_AUX_PORT_NAME="rear"
-