اجرای رادیو

در این صفحه نحوه پیاده سازی رادیو در سطوح سخت افزاری و نرم افزاری توضیح داده شده است.

اجزای سیستم

پشته رادیویی پخش شامل اجزای زیر است.

معماری رادیو پخش
شکل 1. معماری رادیو پخش

برنامه مرجع رادیو

برای جزئیات در مورد نحوه اجرای رادیو کنترل، اجرای رادیو کنترل را ببینید.

یک نمونه برنامه رادیویی جاوا ( 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 HAL: هنگامی که یک جلسه تیونر جدید باز می شود، جلسه قبلی باید خاتمه یابد.
  • AIDL HAL: از آنجایی که هیچ جلسه تیونری در دسترس نیست، فقط باید تماس گیرنده تنظیم شود. اگر وجود داشته باشد، تماس قبلی باید تنظیم شود.
HIDL 2.0 openSession(ITunerCallback callback) ایجاد می کند (Result result, ITunerSession session)
ایدل void setTunerCallback(in ITunerCallback callback)
شرح:
  • HIDL HAL: بستن جلسه تیونر نباید با شکست مواجه شود و فقط باید یک بار صادر شود.
  • AIDL HAL: هیچ تیونری وجود ندارد و فقط تماس برگشتی تیونر باید تنظیم شود.
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 و غیره). هر باند دارای دایرکتوری سطح بالا جداگانه است.
ساختار درختی MediaBrowserService
شکل 2. ساختار درختی MediaBrowserService

هر عنصر در هر یک از این پوشه ها (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 باید از صفحه بندی پشتیبانی کند:

    توجه: به‌طور پیش‌فرض، صفحه‌بندی به‌طور پیش‌فرض در نوع 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 آن حاوی برچسب‌های رادیویی خاص نیست. بنابراین، مشتری که مایل است بررسی کند آیا منبع معینی در دستگاه موجود است، باید:

    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 است. برای هر منبع صوتی یک هدف جداگانه تعریف شده است:

    • 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.x IdentifierType مشخص شده اند و قالب مقدار یک عدد اعشاری یا هگزادسیمال (با پیشوند 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 (اما هر شکاف باید همیشه در درخت وجود داشته باشد).

    ساختار درختی سی دی صوتی
    شکل 3. ساختار درخت CD صوتی

    این ورودی‌ها به روشی مشابه که پوشه‌های رادیویی پخش هستند علامت‌گذاری می‌شوند. آنها حاوی فیلدهای اضافی تعریف شده در MediaDescription API هستند:

    • EXTRA_CD_TRACK : برای هر MediaItem در CD صوتی، 1 شماره آهنگ بر اساس.
    • EXTRA_CD_DISK : شماره دیسک مبتنی بر 1.

    برای سیستم های دارای CD-Text و دیسک سازگار، MediaItem سطح بالای یک عنوان دیسک دارد. به طور مشابه، MediaItems برای آهنگ‌ها، عنوان آهنگ را دارد.

    ورودی کمکی

    برنامه‌ای که ورودی کمکی را ارائه می‌کند، درخت MediaBrowser را با یک ورودی (یا بیشتر، در صورت وجود چندین پورت) نشان‌دهنده AUX در پورت نشان می‌دهد. MediaSession مربوطه mediaId خود را می گیرد و پس از دریافت درخواست playFromMediaId به آن منبع سوئیچ می کند.

    ساختار درختی AUX
    شکل 4. ساختار درختی AUX

    هر ورودی 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
    • موارد دلخواه (قابل پخش ، قابل پخش) 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
    • 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
    • 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
    • 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
    • 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"