در این صفحه نحوه پیاده سازی رادیو در سطوح سخت افزاری و نرم افزاری توضیح داده شده است.
- اجزای سیستم پشته فناوری رادیویی را نشان می دهد و توصیف می کند.
- لایه انتزاعی سخت افزار رادیویی پخش (HAL) ساختارهای داده و رابط هایی را برای OEM ها برای پیاده سازی رادیو پخش مانند AM/FM و رادیو پخش صوتی دیجیتال (DAB) در سطح سخت افزار فراهم می کند.
- اجرای کنترل رادیویی مبتنی بر
MediaSession
وMediaBrowse
است که برنامههای Media و دستیار صوتی را قادر میسازند رادیو را کنترل کنند. علاوه بر محتوای ارائه شده در زیر، به ساخت برنامه های رسانه ای برای اتومبیل ها مراجعه کنید.
اجزای سیستم
پشته رادیویی پخش شامل اجزای زیر است.
برنامه مرجع رادیو
برای جزئیات در مورد نحوه اجرای رادیو کنترل، اجرای رادیو کنترل را ببینید.
یک نمونه برنامه رادیویی جاوا ( packages/apps/Car/Radio
) به عنوان پیاده سازی مرجع عمل می کند. هنگامی که سرویس برنامه شروع به کار می کند، از مدیر رادیو می خواهد که یک رادیو تیونر را باز کند. سپس، برنامه میتواند درخواستهایی را به رادیو تیونر ارسال کند، مانند تنظیم یک ایستگاه رادیویی خاص، فرکانس، یا جستجوی ایستگاه رادیویی موجود بعدی. این برنامه بهروزرسانیهایی را از «مدیر رادیو و رادیو تیونر» در رادیو دریافت میکند، مانند اطلاعات برنامههای جاری، فهرستهای برنامههای رادیویی، پیکربندیها و پارامترهای تعریفشده توسط فروشنده. برنامه رادیویی مرجع فقط از رادیو AM و FM پشتیبانی می کند. OEM ها می توانند برنامه رادیو را به دلخواه تغییر داده یا جایگزین کنند.
مدیر رادیو
هنگامی که برنامه از مدیر رادیو برای باز کردن یک تیونر درخواست میکند، مدیر رادیو ( frameworks/base/core/java/android/hardware/radio/RadioManager.java
) از سرویس رادیو پخش درخواست میکند تا یک جلسه تیونر را باز کند و سپس جلسه را در یک تنظیمر میپیچد. رادیو تیونر ( frameworks/base/core/java/android/hardware/radio/RadioTuner.java
)، که به برنامه برگردانده شده است. رادیو تیونر APIهایی (مانند تنظیم، استپ و لغو) را تعریف می کند که می توانند از برنامه های رادیویی فراخوانی شوند و درخواست ها را به سرویس پخش رادیویی ارسال کنند. روشهای پاسخ به تماس ( RadioTuner.Callback
) تعریف شده در Radio Tuner، بهروزرسانیهای مربوط به رادیو پخش HAL، مانند اطلاعات برنامههای جاری، فهرستهای برنامه، و پارامترهای تعریفشده توسط فروشنده را از سرویس پخش رادیویی به برنامهها ارسال میکنند.
سرویس رادیویی پخش
سرویس رادیویی پخش ( frameworks/base/services/core/java/com/android/server/broadcastradio
) سرویس مشتری برای پخش رادیو HAL است. سرویس رادیویی پخش چندین مدیر رادیویی را با HAL های رادیویی پخش هماهنگ می کند. سرویس رادیو پخش از زبان تعریف رابط HAL (HIDL) و زبان تعریف رابط اندروید (AIDL) HAL های پخش رادیویی پشتیبانی می کند. هنگامی که هر سرویس AIDL HAL وجود دارد، سرویس رادیویی پخش به AIDL HAL پیوند مییابد. در غیر این صورت، سرویس به HIDL HAL پیوند می یابد. سرویس رادیویی پخش یک ماژول رادیویی برای هر نمونه HAL موجود (مانند AM، FM، و DAB) ایجاد می کند.
هر مدیر رادیو میتواند از سرویس رادیویی پخش درخواست کند تا بر اساس نوع رادیو، یک جلسه تیونر در ماژول رادیویی مربوطه ایجاد کند. هر جلسه تیونر میتواند روشهایی مانند تنظیم، استپ و لغو (تعریف شده در رابطهای HAL) را برای انجام عملیات بر روی نمونه 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 | ||
---|---|---|
توضیحات: هنگامی که یک عملیات تنظیم (کوک کردن، جستجو (در AIDL) یا اسکن (در HIDL) و مرحله موفقیت آمیز) به طور ناهمزمان با شکست مواجه می شود توسط HAL فراخوانی می شود. | ||
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) | |
توضیحات: هنگامی که لیست برنامه به روز می شود، فراخوانی می شود. اندازه هر قطعه باید به 500 کیلو بایت محدود شود. | ||
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
منتقل شد.
IBroadcast Radio | ||
---|---|---|
توضیحات: توضیحات یک ماژول و قابلیت های آن را دریافت کنید. | ||
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، به دلیل محدودیت سخت در بافر تراکنش بایندر، اندازه تصویر باید کمتر از 1 مگابایت باشد. | ||
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
باشد، زمانی که کار تنظیم ناموفق بوده است (مثلاً به دلیل مهلت زمانی) یا تکمیل شده است، تنظیم کننده تماس برگشتی تنظیم کنندهtuneFailed
یاcurrentProgramInfoChanged
باید فراخوانی شود.
به طور مشابه، startProgramListUpdates
همچنین کار زمان بر به روز رسانی لیست برنامه را برنامه ریزی می کند تا بعداً انجام شود و به سرعت یک وضعیت یا نتیجه را بازگرداند. این روش ابتدا درخواستهای بهروزرسانی معلق را لغو میکند و سپس کار بهروزرسانی را زمانبندی میکند و به سرعت نتیجه را برمیگرداند.
شرایط مسابقه
به دلیل رفتار ناهمزمان عملیات تنظیم (به عنوان مثال، تنظیم، اسکن (در HIDL) یا جستجو (در AIDL)، و مرحله)، یک شرایط مسابقه بین لغو عملیات و عملیات تنظیم وجود دارد. اگر cancel
پس از اتمام HAL یک عملیات تنظیم و قبل از تکمیل تماس فراخوانی شود، می توان لغو را نادیده گرفت و پاسخ تماس باید تکمیل شود و توسط سرویس گیرنده HAL دریافت شود.
به طور مشابه، اگر stopProgramListUpdates
پس از تکمیل بهروزرسانی لیست برنامه توسط HAL و قبل از تکمیل فراخوانی onCurrentProgramInfoChanged
فراخوانی شود، stopProgramListUpdates
میتوان نادیده گرفت و تماس مجدد باید کامل شود.
محدودیت اندازه داده
از آنجایی که محدودیت سختی در بافر تراکنش بایندر وجود دارد، محدودیت داده برای برخی از روشهای رابط که دادههایی با اندازه بالقوه بزرگ را ارسال میکنند، در AIDL HAL مشخص میشوند.
-
getImage
نیاز دارد که تصویر کمتر از 1 مگابایت برگردانده شود. -
onProgramListUpdate
نیاز دارد که هرchunk
کمتر از 500 کیلو بایت باشد. لیست های برنامه های بزرگتر باید توسط اجرای HAL به چند تکه تقسیم شده و از طریق تماس های متعدد ارسال شوند.
تغییرات در ساختار داده AIDL HAL
علاوه بر تغییرات در رابط ها، این تغییرات در ساختارهای داده تعریف شده در رادیو پخش AIDL HAL اعمال شده است که از AIDL بهره می برد.
- Enum
Constant
در AIDL حذف می شود و به عنوان const int درIBroadcastRadio
تعریف می شود. در همین حال،ANTENNA_DISCONNECTED_TIMEOUT_MS
بهANTENNA_STATE_CHANGE_TIMEOUT_MS
تغییر نام داد. یک Const int جدیدTUNER_TIMEOUT_MS
اضافه شده است. تمام عملیات تنظیم، جستجو و گام باید در این زمان تکمیل شود. - Enum
RDS
وDeemphasis
در AIDL حذف شده و درAmFmRegionConfig
به عنوان const int تعریف می شوند. به همین ترتیب، هر دو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
است که برنامههای Media و دستیار صوتی را قادر میسازند رادیو را کنترل کنند. برای اطلاعات بیشتر، به ساخت برنامه های رسانه ای برای اتومبیل ها در developer.android.com مراجعه کنید.
یک پیادهسازی درخت مرور رسانهای در کتابخانه car-broadcastradio-support در 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
. هر محتوایی را از یک پوشه سطح بالا پخش کنید. برای مثال، «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) یک MediaIt با یک MediaId است که می تواند با MediaSession برای شروع پخش استفاده شود و به صلاحدید OEM بستگی دارد. به عنوان مثال، «Play FM»، «Play AM» و «Play Radio» همه عبارتهای رادیویی غیر اختصاصی هستند که از یک mediaId برای ارسال به برنامه رادیویی OEM استفاده میکنند. این به برنامه رادیویی بستگی دارد که چه چیزی را از درخواست عمومی و mediaId پخش کند.
MediaSession
با توجه به اینکه مفهومی برای توقف پخش جریانی وجود ندارد، عملکردهای Play، Pause و Stop همیشه برای رادیو اعمال نمی شود. در رادیو، عمل توقف با بیصدا کردن جریان همراه است در حالی که Play با حذف بیصدا همراه است.
برخی از تیونرهای رادیویی (یا برنامه ها) توانایی شبیه سازی توقف پخش جریانی را با ذخیره محتوا و سپس پخش مجدد آن در آینده فراهم می کنند. در چنین مواردی، onPause
استفاده کنید.
پخش از اقدامات mediaId و URI برای تنظیم ایستگاهی است که از رابط MediaBrowser واکشی شده است. MediaId یک رشته دلخواه است که توسط برنامه رادیویی برای تحمیل یک مقدار منحصر به فرد (بنابراین شناسه معین فقط به یک آیتم اشاره می کند) و ثابت (بنابراین یک آیتم معین در کل جلسه دارای شناسه یکسان است) ارائه می شود که با آن ایستگاه مشخصی را شناسایی می کند. . URI یک طرحواره کاملاً تعریف شده خواهد بود. به طور خلاصه، یک فرم 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 تا 1700 کیلوهرتز (با استفاده از فاصله 10 کیلوهرتز) می رسد. از آنجایی که رادیو HD از فضای کانال یکسانی استفاده می کند، به طور جداگانه ارائه نمی شود.
فهرست برنامههای رادیویی موجود در حال حاضر صاف است، زیرا این امکان را به طرحهای نمایش مانند گروهبندی بر اساس پخش مستقیم صوتی (DAB) نمیدهد.
ورودیهای فهرست دلخواه ممکن است قابل تنظیم نباشند. به عنوان مثال اگر یک برنامه مشخص خارج از محدوده باشد. برنامه رادیویی ممکن است تشخیص دهد که آیا می توان ورودی را از قبل تنظیم کرد یا خیر. در این صورت، ممکن است ورودی را به عنوان قابل پخش علامت گذاری نکند.
برای شناسایی پوشه های سطح بالا، همان مکانیزم مورد استفاده توسط بلوتوث اعمال می شود. یعنی یک بسته Extras از شی MediaDescription
حاوی یک فیلد مخصوص تیونر است، درست مانند بلوتوث با 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()
بدون مدیریت گزینهها پیادهسازی میشود.ورودیهای مرتبط از همه انواع فهرستها (کانالهای خام، برنامههای یافت شده و موارد دلخواه) ممکن است شناسههای رسانهای متفاوتی داشته باشند (این به برنامه رادیویی بستگی دارد؛ کتابخانه پشتیبانی آنها را متفاوت خواهد داشت). URI ها (به شکل ProgramSelector) بین کانال های خام و برنامه هایی که در بیشتر موارد یافت می شوند (به جز FM بدون RDS) متفاوت است، اما عمدتاً بین برنامه های یافت شده و مورد علاقه یکسان است (به جز، به عنوان مثال، زمانی که AF به روز شد).
داشتن MediaId های مختلف برای ورودی ها از انواع مختلف لیست ها، انجام اقدامات متفاوت روی آنها را ممکن می کند. بسته به پوشه
MediaItem
اخیراً انتخاب شده، می توانید از لیست علاقه مندی ها یا لیست همه برنامه ها درonSkipToNext
عبور کنید (به MediaSession مراجعه کنید).اقدامات لحن ویژه
لیست برنامه کاربران را قادر می سازد تا روی یک ایستگاه خاص تنظیم شوند، اما به کاربران اجازه نمی دهد درخواست های عمومی مانند "Tune to FM" را ارائه دهند، که می تواند منجر به تنظیم ایستگاهی شود که اخیراً در باند FM گوش داده است.
برای پشتیبانی از چنین اقداماتی، برخی دایرکتوری های سطح بالا دارای پرچم
FLAG_PLAYABLE
هستند (به همراهFLAG_BROWSABLE
برای پوشه ها).عمل آهنگ به نحوه صدور پخش رادیو هر کانال رادیویی startService(ACTION_PLAY_BROADCASTRADIO)
یا
playFromMediaId(MediaBrowser. getRoot() )
پخش FM هر کانال FM پخش از mediaId
باند FM.تعیین اینکه کدام برنامه را تنظیم کنیم به برنامه بستگی دارد. این معمولاً جدیدترین کانالی است که از لیست داده شده برای کانال تنظیم شده است. برای جزئیات بیشتر در مورد
ACTION_PLAY_BROADCASTRADIO
، به اهداف کلی بازی مراجعه کنید.اتصال کشف و خدمات
PackageManager
می تواند مستقیماً درخت رادیویی پخش سرویس MediaBrowserService را پیدا کند. برای انجام این کار، با هدفACTION_PLAY_BROADCASTRADIO
(به اهداف کلی بازی مراجعه کنید) و پرچمMATCH_SYSTEM_ONLY
باresolveService
تماس بگیرید. برای یافتن همه سرویسهایی که رادیو ارائه میدهند (ممکن است بیش از یک سرویس وجود داشته باشد؛ برای مثال، AM/FM و ماهواره را جدا کنید)، ازqueryIntentServices
استفاده کنید.سرویس حلوفصل شده، هدف bind
android.media.browse.MediaBrowserService
را نیز مدیریت میکند. این با GTS تایید شده است.برای اتصال به MediaBrowserService انتخاب شده، نمونه
MediaBrowser
را برای یک جزء سرویس داده شده ایجاد کنید وconnect
. پس از برقراری ارتباط، میتوان از طریقgetSessionToken
یک دسته برای MediaSession دریافت کرد.برنامه رادیو می تواند بسته های مشتری مجاز به اتصال در اجرای
onGetRoot
سرویس خود را محدود کند. این برنامه باید به برنامههای سیستم اجازه دهد بدون درج لیست سفید به هم متصل شوند. برای جزئیات بیشتر در مورد فهرست مجاز، به پذیرش بسته و امضای برنامه دستیار مراجعه کنید.اگر برنامه اختصاصی منبع (مثلاً یک برنامه رادیویی) روی دستگاهی بدون پشتیبانی از چنین منبعی نصب شود، همچنان خود را به عنوان مدیریت هدف
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-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
: فضای ذخیره سازی رسانه محلی (فلش داخلی)
Intent ها برای استفاده برای دستور پخش عمومی انتخاب شدند، زیرا آنها دو مشکل را همزمان حل می کنند: خود فرمان عمومی و کشف سرویس. مزیت اضافی داشتن چنین قصدی امکان اجرای چنین اقدام ساده ای بدون باز کردن جلسه MediaBrowser است.
کشف سرویس در واقع مهمترین مشکل حل شده با این اهداف است. روش کشف سرویس از این طریق آسان و صریح است (به کشف و اتصال سرویس مراجعه کنید).
برای آسانتر کردن برخی از پیادهسازیهای کلاینت، یک راه جایگزین برای صدور دستور Play وجود دارد (که باید توسط برنامه رادیویی نیز اجرا شود): صدور
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)
program
فضایی را برای گسترش طرح در آینده فراهم می کند. رشته های نوع شناسه دقیقاً به عنوان نام آنها در تعریف HAL 2.xIdentifierType
مشخص شده اند و قالب مقدار یک عدد اعشاری یا هگزادسیمال (با پیشوند0x
) است.همه شناسه های خاص فروشنده با پیشوند
VENDOR_
نشان داده می شوند. به عنوان مثال،VENDOR_0
برایVENDOR_START
وVENDOR_1
برایVENDOR_START
به علاوه 1. این URI ها مختص سخت افزار رادیویی هستند که روی آن تولید شده اند و نمی توانند بین دستگاه های ساخته شده توسط OEM های مختلف منتقل شوند.این URI ها باید به هر MediaItem در زیر پوشه های رادیویی سطح بالا اختصاص داده شوند. علاوه بر این، MediaSession باید از
playFromMediaId
وplayFromUri
پشتیبانی کند. با این حال، URI در درجه اول برای استخراج ابرداده های رادیویی (مانند فرکانس FM) و ذخیره سازی مداوم در نظر گرفته شده است. هیچ تضمینی وجود ندارد که URI برای همه موارد رسانه در دسترس باشد (به عنوان مثال، زمانی که نوع شناسه اصلی هنوز توسط چارچوب پشتیبانی نمی شود). از طرف دیگر Media ID همیشه کار می کند. توصیه نمی شود که مشتریان از URI برای انتخاب موارد از جلسه MediaBrowser فعلی استفاده کنند. در عوض، ازplayFromMediaId
استفاده کنید. با این حال، برای برنامه ارائهدهنده اختیاری نیست و URIهای گمشده برای موارد کاملاً توجیهشده رزرو شدهاند.در طرح اولیه به جای دنباله
://
بعد از بخش طرح، از یک دونقطه استفاده شد. با این حال، مورد اول توسطandroid.net.Uri
برای مراجع URI سلسله مراتبی مطلق پشتیبانی نمی شود.انواع دیگر منبع
سایر منابع صوتی را می توان به طور مشابه مدیریت کرد. به عنوان مثال، ورودی کمکی و پخش کننده CD صوتی.
یک برنامه واحد ممکن است چندین نوع منبع را ارائه دهد. در چنین مواردی، توصیه می شود برای هر نوع منبع، یک MediaBrowserService جداگانه ایجاد کنید. حتی در راه اندازی با چندین منبع ارائه شده/MediaBrowserServices، اکیداً توصیه می شود که یک MediaSession در یک برنامه واحد داشته باشید.
سی دی صوتی
مشابه سی دی صوتی که برنامهای که چنین دیسکهایی را ارائه میکند، 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 در پورت نشان میدهد. 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
نیست). اگر سخت افزار چنین توانایی ای نداشته باشد ، 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"
مشتری باید رسانه های سطح بالا را برای عناصر دارای مجموعه قسمت اضافی
EXTRA_CD_DISK
یاEXTRA_AUX_PORT_NAME
بررسی کند.نمونه های تفصیلی
مثالهای زیر به ساختار درخت MediaBrowser برای انواع منبع که بخشی از این طرح است ، می پردازد.
پخش رادیو MediaBrowserService (دست به کار
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 AM (قابل پخش) 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
- بی بی سی دو (قابل پخش نیست) 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 AM (قابل پخش) 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"
CD 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 (قابل پخش)
- CD موسیقی من (قابل پخش ، قابل پخش)
EXTRA_CD_DISK=3
- همه خودم (قابل پخش)
EXTRA_CD_TRACK=1
- Reise ، Reise (قابل پخش)
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"
-