اجرای کنترل رادیویی مبتنی بر 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 در یک برنامه واحد داشته باشید.
سی دی صوتی
مشابه CD صوتی که برنامهای که چنین دیسکهایی را ارائه میکند، MediaBrowser را با یک ورودی قابل مرور (یا بیشتر، اگر سیستم دارای یک سیدی چنجر باشد) نمایش میدهد، که به نوبه خود شامل تمام آهنگهای یک سیدی معین میشود. اگر سیستم اطلاعاتی در مورد تراک های روی هر سی دی نداشته باشد (مثلاً وقتی همه دیسک ها به طور همزمان در یک کارتریج قرار می گیرند و همه آنها را نمی خواند)، آنگاه MediaItem برای کل دیسک فقط
PLAYABLE
خواهد بود، نهBROWSABLE
به علاوهPLAYABLE
. اگر دیسکی در یک شکاف مشخص وجود نداشته باشد، مورد نهPLAYABLE
است و نهBROWSABLE
(اما هر شکاف باید همیشه در درخت وجود داشته باشد).این ورودی ها به روشی مشابه با پوشه های رادیویی پخش علامت گذاری می شوند. آنها حاوی فیلدهای اضافی تعریف شده در MediaDescription API هستند:
-
EXTRA_CD_TRACK
: برای هرMediaItem
در CD صوتی، 1 شماره آهنگ بر اساس. -
EXTRA_CD_DISK
: شماره دیسک مبتنی بر 1.
برای سیستم های دارای CD-Text و دیسک سازگار، MediaItem سطح بالای یک عنوان دیسک دارد. به طور مشابه، MediaItems برای آهنگها، عنوان آهنگ را دارد.
ورودی کمکی
برنامه ای که ورودی کمکی را ارائه می دهد، درخت MediaBrowser را با یک ورودی (یا بیشتر، در صورت وجود چندین پورت) نشان می دهد که نشان دهنده AUX در پورت است. 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"
مشتری باید 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
- URI BBC One (قابل پخش):
- موارد دلخواه (قابل مرور، قابل پخش)
EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_FAVORITES
- URI BBC One (قابل پخش):
broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=101300
- BBC Two (قابل پخش) URI:
broadcastradio://program/RDS_PI/1300?AMFM_FREQUENCY=102100
- URI BBC One (قابل پخش):
- AM (قابل مرور، قابل پخش):
EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="AM"
- 530 AM (قابل پخش) URI:
broadcastradio://program/AMFM_FREQUENCY/530
- 540 AM (قابل پخش) URI:
broadcastradio://program/AMFM_FREQUENCY/540
- 550 AM (قابل پخش) URI:
broadcastradio://program/AMFM_FREQUENCY/550
- 530 AM (قابل پخش) URI:
- 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
- URI 87.7 FM (قابل پخش):
- 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
- آهنگ 1 (قابل پخش)
- سی دی موسیقی من (قابل مرور، قابل پخش)
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"
-