اجرای رادیو کنترل

اجرای کنترل رادیویی مبتنی بر 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 در یک برنامه واحد داشته باشید.

    سی دی صوتی

    مشابه CD صوتی که برنامه‌ای که چنین دیسک‌هایی را ارائه می‌کند، 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"

    مشتری باید MediaItems سطح بالا را برای عناصر دارای مجموعه فیلد اضافی EXTRA_CD_DISK یا EXTRA_AUX_PORT_NAME بررسی کند.

    نمونه های تفصیلی

    مثال‌های زیر ساختار درختی MediaBrowser را برای انواع منبع که بخشی از این طرح هستند، نشان می‌دهد.

    پخش رادیو MediaBrowserService (کنترل ACTION_PLAY_BROADCASTRADIO ):

    • ایستگاه‌ها (قابل مرور) EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_PROGRAMS
      • URI BBC One (قابل پخش): broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=90500
      • URI ABC 88.1 (قابل پخش): broadcastradio://program/RDS_PI/5678?AMFM_FREQUENCY=88100
      • 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
      • URI BBC One (قابل پخش): broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=101300
      • BBC Two (قابل پخش) URI: broadcastradio://program/RDS_PI/1300?AMFM_FREQUENCY=102100
    • AM (قابل مرور، قابل پخش): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="AM"
      • 530 AM (قابل پخش) URI: broadcastradio://program/AMFM_FREQUENCY/530
      • 540 AM (قابل پخش) 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"
      • URI 87.7 FM (قابل پخش): broadcastradio://program/AMFM_FREQUENCY/87700
      • URI 87.9 FM (قابل پخش): 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 صوتی MediaBrowserService (کنترل ACTION_PLAY_AUDIOCD ):

    • دیسک 1 (قابل پخش) EXTRA_CD_DISK=1
    • دیسک 2 (قابل مرور، قابل پخش) EXTRA_CD_DISK=2
      • آهنگ 1 (قابل پخش) EXTRA_CD_TRACK=1
      • آهنگ 2 (قابل پخش) EXTRA_CD_TRACK=2
    • سی دی موسیقی من (قابل مرور، قابل پخش) EXTRA_CD_DISK=3
      • همه توسط خودم (قابل پخش) EXTRA_CD_TRACK=1
      • Reise، Reise (قابل پخش) EXTRA_CD_TRACK=2
    • شکاف خالی 4 (قابل پخش نیست) EXTRA_CD_DISK=4

    AUX MediaBrowserService (کنترل ACTION_PLAY_AUX ):

    • جلو AUX (قابل پخش) EXTRA_AUX_PORT_NAME="front"
    • AUX عقب (قابل پخش) EXTRA_AUX_PORT_NAME="rear"