يستند تنفيذ التحكّم في الراديو إلى MediaSession
و
MediaBrowse
، ما يتيح لتطبيقات الوسائط ومساعدات الصوت
التحكّم في الراديو. لمزيد من المعلومات، يُرجى الاطّلاع على مقالة إنشاء تطبيقات وسائط للسيارات على developer.android.com.
يتم توفير تنفيذ شجرة تصفُّح الوسائط في مكتبة car-broadcastradio-support
في packages/apps/Car/libs
. تحتوي هذه المكتبة أيضًا على إضافات
لبرنامج Selector من أجل التحويل من عنوان URL والعكس. ننصحك باستخدام هذه المكتبة لإنشاء شجرة التصفّح المرتبطة عند تنفيذ تطبيقات الراديو.
أداة تبديل مصادر الوسائط
لتوفير انتقال سلس بين التطبيق المخصّص للراديو والتطبيقات الأخرى المعروضة في الوسائط،
تحتوي مكتبة car-media-common على فئات يجب دمجها في تطبيق
الراديو. يمكن تضمين MediaAppSelectorWidget
في ملف XML الخاص بتطبيق
الراديو (الرمز والقائمة المنسدلة المستخدَمة في الوسائط المرجعية وتطبيقات الراديو):
<com.android.car.media.common.MediaAppSelectorWidget android:id="@+id/app_switch_container" android:layout_width="@dimen/app_switch_widget_width" android:layout_height="wrap_content" android:background="@drawable/app_item_background" android:gravity="center" />
يشغِّل التطبيق المصغّر هذا AppSelectionFragment
الذي يعرض
قائمة بمصادر الوسائط التي يمكن التبديل إليها. إذا أردت استخدام واجهة مستخدم مختلفة عن الواجهة المقدَّمة،
يمكنك إنشاء تطبيق مصغّر مخصّص لتشغيل AppSelectionFragment
عندما يجب عرض التبديل.
AppSelectionFragment newFragment = AppSelectionFragment.create(widget, packageName, fullScreen); newFragment.show(mActivity.getSupportFragmentManager(), null);
يتوفّر نموذج لتنفيذ تطبيق الراديو المرجعي،
والذي يمكن العثور عليه في packages/apps/Car/Radio
.
مواصفات التحكّم التفصيلية
توفّر واجهة MediaSession
(من خلال MediaSession.Callback
)
آليات التحكّم في برنامج الراديو الذي يتم تشغيله حاليًا:
onPlay
،onStop
. كتم صوت تشغيل الراديو أو إزالتهonPause
. الإيقاف المؤقت مع تغيير السرعة الزمنية (إذا كان ذلك متاحًا)onPlayFromMediaId
. تشغيل أي محتوى من مجلد بمستوى أعلى على سبيل المثال، "تشغيل راديو FM" أو "تشغيل الراديو".onPlayFromUri
. تشغيل تردد محدّد على سبيل المثال، "تشغيل 88.5 FM".onSkipToNext
،onSkipToPrevious
. انتقِل إلى محطة يليها أو محطة سابقة.onSetRating
. إضافة تطبيقات إلى "التطبيقات المفضّلة" أو إزالتها منها
يعرِض MediaBrowser MediaItem قابل للضبط على مستوى ثلاثة أنواع من الأدلة ذات المستوى الأعلى:
- (اختياري) البرامج (المحطات). يُستخدَم هذا الوضع عادةً في أجهزة الراديو المزودة بموجّهَين للإشارة إلى جميع محطات الراديو القابلة للضبط في الموقع الجغرافي للمستخدم.
- الأماكن المفضّلة: برامج إذاعية تمت إضافتها إلى قائمة "المفضلة"، قد يكون بعضها غير متاح (خارج نطاق الاستقبال).
- قنوات النطاق جميع القنوات التي يمكن استخدامها في المنطقة الحالية (87.9، 88.1، 88.3، 88.5، 88.7، 88.9، 89.1 وما إلى ذلك) لكلّ مجموعة موسيقية دليل من المستوى الأعلى منفصل.
كل عنصر في كل من هذه المجلدات (AM/FM/Programs) هو عنصر MediaItem يحتوي على عنوان URL يمكن استخدامه مع MediaSession لضبط الإعدادات. كل مجلد على المستوى الأعلى (AM/FM/Programs) هو عنصر وسائط يتضمّن معرّف وسائط يمكن استخدامه مع MediaSession لبدء التشغيل، ويعود ذلك إلى تقدير المصنّع الأصلي للجهاز. على سبيل المثال، "تشغيل راديو FM" و"تشغيل راديو AM" و"تشغيل راديو" هي طلبات بحث غير محدّدة للراديو تستخدم mediaId لإرسالها إلى تطبيق الراديو الخاص بصانع الجهاز الأصلي. ويعود الأمر إلى تطبيق الراديو لتحديد المحتوى الذي سيتم تشغيله من الطلب العام وmediaId.
MediaSession
بما أنّه لا يمكن إيقاف البث مؤقتًا، فإنّ إجراءات التشغيل والإيقاف المؤقت والإيقاف لا تنطبق دائمًا على المحتوى الصوتي. في الراديو، يكون الإجراء "إيقاف" مرتبطًا بكتم صوت البث بينما يكون الإجراء "تشغيل" مرتبطًا بإزالة كتم الصوت.
توفّر بعض أجهزة ضبط البثّ الإذاعي (أو التطبيقات) إمكانية إيقاف البثّ مؤقتًا عن طريق
تخزين المحتوى مؤقتًا ثم إعادة تشغيله لاحقًا. في هذه الحالات، استخدِم onPause
.
يهدف التشغيل من إجراءات mediaId وURI إلى ضبط محطة يتم جلبها من واجهة MediaBrowser. mediaId هي سلسلة عشوائية يوفّرها تطبيق الراديو لفرض قيمة فريدة (كي يشير معرّف معيّن إلى عنصر واحد فقط) وثابتة (كي يكون للعنصر المعيّن المعرّف نفسه خلال الجلسة بأكملها) لتحديد محطة معيّنة. سيكون معرّف الموارد المنتظم (URI) من مخطّط محدّد جيدًا. بعبارة أخرى، هو شكل من أشكال ProgramSelector تم تحويله إلى عنوان URL. على الرغم من أنّ ذلك يحافظ على سمة التفرد، ليس من الضروري أن يكون ثابتًا، على الرغم من أنّه يمكن أن يتغيّر عندما تنتقل المحطة إلى تردد مختلف.
لا يتم استخدام 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 كيلوهرتز). وبما أنّ الراديو بدقة عالية يستخدم مساحة القناة نفسها، لا يتم عرضه بشكل منفصل.
قائمة البرامج الإذاعية المتاحة حاليًا ليست مُفصَّلة، وبالتالي لا تسمح بتطبيق تصاميم عرض معيّنة، مثل التجميع حسب مجموعة البث الصوتي المباشر (DAB).
قد لا تكون الإدخالات في قائمة "المحتوى المفضّل" قابلة للضبط. على سبيل المثال، إذا كان أحد البرامج المحدّد خارج النطاق. قد يرصد تطبيق الراديو ما إذا كان يمكن ضبط المحتوى مسبقًا أم لا. في هذه الحالة، قد لا يتم وضع علامة على الإدخال بأنّه قابل للتشغيل.
لتحديد المجلدات على المستوى الأعلى، يتم تطبيق الآلية نفسها المستخدَمة في البلوتوث.
وهذا يعني أنّ حِزمة Extras الخاصة بالعنصر
MediaDescription
تحتوي على حقل خاص بالمعدّل، تمامًا مثلما تفعل البلوتوث مع
EXTRA_BT_FOLDER_TYPE
.
في ما يتعلّق بالإذاعة البثّية، يؤدّي ذلك إلى تحديد الحقول الجديدة التالية في
واجهة برمجة التطبيقات العامة:
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: عنوان URL (راجِع
ProgramSelector) أو
MediaDescription.getTitle
(إذا كان الإدخال في مجلدBROADCASTRADIO_FOLDER_TYPE_BAND
). - المعرّفات الخاصة بالراديو (RDS PI وDAB SId)
تم تحليل
MediaDescription.getMediaUri
إلى ProgramSelector.
لا يلزم عادةً جلب تردد FM لإدخال في البرنامج الحالي أو قائمة "المفضلة" (لأنّه من المفترض أن يعمل العميل على معرّفات الوسائط). ومع ذلك، إذا ظهرت الحاجة إلى ذلك (على سبيل المثال، لأغراض العرض)، سيكون متوفّرًا في عنوان URL ويمكن تحليله إلى
ProgramSelector
. ومع ذلك، لا يُنصح باستخدام عنوان URL لاختيار العناصر ضمن الجلسة الحالية. للاطّلاع على التفاصيل، يُرجى مراجعةProgramSelector
.لتجنُّب المشاكل المتعلّقة بالأداء أو ببرنامج ربط البيانات، يجب أن توفّر خدمة MediaBrowser ميزة تقسيم الصفحات:
EXTRA_PAGE
EXTRA_PAGE_SIZE
- مَعلمات إضافية لـ
subscribe()
ملاحظة: يتم تطبيق تقسيم الصفحات تلقائيًا في
onLoadChildren()
بدون معالجة الخيارات.قد تحتوي الإدخالات ذات الصلة من جميع أنواع القوائم (القنوات الأوّلية والبرامج التي تم العثور عليها والمفضّلة) على معرّفات mediaId مختلفة (يعود الأمر إلى تطبيق الراديو، وستكون مكتبة الدعم مختلفة). تختلف عناوين URL (بتنسيق ProgramSelector) بين القنوات والبرامج الأوّلية التي يتم العثور عليها في معظم الحالات (باستثناء FM بدون RDS)، ولكنّها تكون متطابقة في معظم الأحيان بين البرامج التي يتم العثور عليها والبرامج المفضّلة (باستثناء، على سبيل المثال، عند تعديل AF).
إنّ توفُّر معرّفات mediaId مختلفة للعناصر من أنواع مختلفة من القوائم يجعل من المُمكن اتخاذ إجراءات مختلفة بشأنها. يمكنك التنقّل في قائمة "المفضّلة" أو قائمة "جميع البرامج" على
onSkipToNext
، استنادًا إلى مجلدMediaItem
الذي تم اختياره مؤخرًا (راجِع MediaSession).إجراءات اللحن الخاص
تتيح قائمة البرامج للمستخدمين ضبط التردد على محطة معيّنة، ولكن لا تسمح لهم بتقديم طلبات عامة مثل "ضبط التردد على FM"، ما قد يؤدي إلى ضبط التردد على محطة تم الاستماع إليها مؤخرًا على نطاق FM.
لتمكين هذه الإجراءات، تم ضبط علامة
FLAG_PLAYABLE
في بعض الأدلة ذات المستوى الأعلى (بالإضافة إلىFLAG_BROWSABLE
للمجلدات).الإجراء نغمات تناسب كيفية إصدار التذكرة تشغيل الراديو أي قناة راديو startService(ACTION_PLAY_BROADCASTRADIO)
أو
playFromMediaId(MediaBrowser.getRoot())
Play FM أي قناة FM يمكنك التشغيل من mediaId
نطاق FM.يحدد التطبيق البرنامج الذي يتم ضبطه، وعادةً ما يكون ذلك القناة التي تم ضبطها مؤخرًا من القائمة المحدّدة. لمعرفة التفاصيل حول
ACTION_PLAY_BROADCASTRADIO
، يُرجى الاطّلاع على النوايا العامة للتشغيل.اكتشاف الخدمات والربط بها
يمكن أن يعثر
PackageManager
مباشرةً على MediaBrowserService التي تعرِض شجرة البث الإذاعي. لإجراء ذلك، يمكنك استدعاءresolveService
باستخدام النيةACTION_PLAY_BROADCASTRADIO
(راجِع النوايا العامة للتشغيل) ومربّع الاختيارMATCH_SYSTEM_ONLY
. للعثور على جميع الخدمات التي توفّر خدمة الراديو (قد يكون هناك أكثر من خدمة واحدة، مثل AM/FM وخدمات الأقمار الصناعية المنفصلة)، استخدِمqueryIntentServices
.تعالج الخدمة التي تم حلّها أيضًا النية
android.media.browse.MediaBrowserService
bind. يتم التحقّق من ذلك من خلال GTS.للاتصال بخدمة MediaBrowserService المحدّدة، أنشئ مثيل
MediaBrowser
لمكوّن خدمة معيّن وconnect
. بعد إنشاء الاتصال، يمكن الحصول على معرّف MediaSession من خلالgetSessionToken
.يمكن لتطبيق "راديو Google" حظر حِزم العملاء المسموح لها بالاتصال في تنفيذ
onGetRoot
لخدمتهم. من المفترض أن يسمح التطبيق لتطبيقات النظام بالاتصال بدون إضافة التطبيقات إلى القائمة البيضاء. لمعرفة التفاصيل حول القائمة المسموح بها، يُرجى الاطّلاع على مقالة قبول حزمة تطبيق "مساعد Google" وتوقيعه.إذا تم تثبيت تطبيق خاص بالمصدر (مثل تطبيق راديو) على جهاز لا يتيح استخدام هذا المصدر، سيظل التطبيق يعرّف نفسه على أنّه يعالج
ACTION_PLAY_BROADCASTRADIO
النية، ولكن لن تحتوي شجرة MediaBrowser على علامات خاصة بالراديو. وبالتالي، على العميل الذي يريد التحقّق مما إذا كان مصدر معيّن متوفّرًا على جهاز ما، تنفيذ ما يلي:- التعرّف على خدمة الراديو (الاتصال على
resolveService
للحصول علىACTION_PLAY_BROADCASTRADIO
) - أنشئ
MediaBrowser
ثم اربط حسابك به. - حدِّد مدى توفّر
MediaItem
باستخدامEXTRA_BCRADIO_FOLDER_TYPE
الإضافية.
ملاحظة: في معظم الحالات، على العميل فحص كل شجرات MediaBrowser المتاحة لرصد جميع المصادر المتاحة لجهاز معيّن.
أسماء النطاقات
يتم تمثيل قائمة النطاقات من خلال مجموعة من الأدلة ذات المستوى الأعلى التي تم ضبط علامة نوع المجلد فيها على
BCRADIO_FOLDER_TYPE_BAND
. عناوينMediaItem
هي سلاسل مترجَمة تمثّل أسماء الفرق الموسيقية. في معظم الحالات، سيكون المحتوى مطابقًا للترجمة الإنجليزية، ولكن لا يمكن للعميل الاعتماد على هذا الافتراض.لتوفير آلية ثابتة للبحث عن نطاقات معيّنة، تتم إضافة علامة إضافية لمجلدات النطاقات،
EXTRA_BCRADIO_BAND_NAME_EN
. هذا هو اسم النطاق غير المُعرَّب، ويمكن أن يأخذ إحدى القيم المحدَّدة مسبقًا التالية فقط:AM
FM
DAB
إذا لم تكن الفرقة مُدرَجة في هذه القائمة، يجب عدم ضبط علامة اسم الفرقة. ومع ذلك، إذا كان النطاق مُدرَجًا في القائمة، يجب أن يكون لديه مجموعة علامات. لا يُدرِج راديو HD نطاقات منفصلة لأنّه يستخدم الوسيط الأساسي نفسه المستخدَم في بثّ AM/FM.
نوايا اللعب العامة
يجب أن يعالج كل تطبيق مخصّص لتشغيل مصدر معيّن (مثل الراديو أو القرص المضغوط) طلب تشغيل عام لبدء تشغيل بعض المحتوى من حالة عدم النشاط (على سبيل المثال، بعد التشغيل). يعتمد اختيار المحتوى الذي سيتم بدء تشغيله على التطبيق، ولكن عادةً ما يكون البرنامج الإذاعي أو مقطع الأغنية الذي تم تشغيله مؤخرًا.هناك نية منفصلة محدّدة لكل مصدر صوت:
android.car.intent.action.PLAY_BROADCASTRADIO
-
android.car.intent.action.PLAY_AUDIOCD
: CD-DA أو CD-Text android.car.intent.action.PLAY_DATADISC
: قرص بيانات ضوئي مثل CD/DVD، ولكن ليس CD-DA (قد يكون قرص CD بوضع مختلط)android.car.intent.action.PLAY_AUX
: بدون تحديد مَنفذ AUXandroid.car.intent.action.PLAY_BLUETOOTH
android.car.intent.action.PLAY_USB
: بدون تحديد جهاز USBandroid.car.intent.action.PLAY_LOCAL
: مساحة تخزين الوسائط المحلية (ذاكرة فلاش مدمجة)
تم اختيار النية لاستخدامها في الأمر العام للتشغيل، لأنّها تحلّ مشكلتَين في آنٍ واحد: الأمر العام للتشغيل نفسه واكتشاف الخدمة. من المزايا الإضافية لوجود هذا الإجراء إمكانية تنفيذ هذا الإجراء البسيط بدون فتح جلسة MediaBrowser.
إنّ اكتشاف الخدمة هو المشكلة الأكثر أهمية التي يتم حلّها باستخدام هذه النوايا. بهذه الطريقة، يكون إجراء اكتشاف الخدمة سهلًا وواضحًا (راجِع الاكتشاف وربط الخدمة).
لتسهيل تنفيذ بعض التطبيقات، هناك طريقة بديلة لإصدار أمر Play هذا (يجب أن ينفذه تطبيق الراديو أيضًا): إصدار
playFromMediaId
باستخدام معرّف الجذر للعقدة الجذر (يُستخدَم كمعرّف الوسائط). على الرغم من أنّه ليس من المفترض أن يكون العقدة الجذر قابلة للتشغيل، فإنّ rootId هو سلسلة عشوائية يمكن استخدامها كـ mediaId. ومع ذلك، ليس مطلوبًا من العملاء فهم هذه التفاصيل الدقيقة.ProgramSelector
على الرغم من أنّ
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
يقدّم جزء السلطة (المعروف أيضًا باسم المضيف) من
program
بعض المساحة لإضافة مزيد منprogram
في المستقبل. يتم تحديد سلاسل أنواع المعرّفات بدقة كأسماء لها في تعريفIdentifierType
في HAL 2.x، ويكون تنسيق القيمة عددًا عشريًا أو سداسيًا عشريًا (مع البادئة0x
).يتم تمثيل جميع المعرّفات الخاصة بالمورّدين باستخدام البادئة
VENDOR_
. على سبيل المثال،VENDOR_0
لرمزVENDOR_START
وVENDOR_1
لرمزVENDOR_START
زائد 1. إنّ معرّفات الموارد المنتظمة هذه خاصة بجهاز الراديو الذي تم إنشاؤها عليه ولا يمكن نقلها بين الأجهزة التي تصنعها شركات تصنيع أصلية مختلفة.يجب إسناد عناوين URL هذه إلى كل عنصر MediaItem ضمن مجلدات radio ذات المستوى الأعلى. بالإضافة إلى ذلك، يجب أن تتوافق MediaSession مع كل من
playFromMediaId
وplayFromUri
. ومع ذلك، فإنّ عنوان URL مخصّص في الأساس لاستخراج ملف البث المرئي والصوتي (مثل تردد FM) وتخزينه بشكل دائم. لا يمكن ضمان توفّر عنوان URL لجميع عناصر الوسائط (على سبيل المثال، عندما يكون نوع معرّف الأساسي غير متوافق بعد مع إطار العمل). من ناحية أخرى، يعمل رقم تعريف الوسائط دائمًا. لا يُنصح بأن يستخدم العملاء معرّف الموارد المتّصل (URI) لاختيار العناصر من جلسة MediaBrowser الحالية. استخدِمplayFromMediaId
بدلاً من ذلك. ومع ذلك، فإنّه ليس اختياريًا للتطبيق الذي يعرض المحتوى، ويتم حجز معرّفات الموارد المنتظمة غير المتوفّرة للحالات التي تتضمّن أسبابًا وجيهة.استخدَم التصميم الأوّلي فاصلة واحدة بدلاً من تسلسل
://
بعد جزء المخطّط. ومع ذلك، لا يتوافق الخيار الأول معandroid.net.Uri
لمراجع معرّفات الموارد المنتظمة (URI) التسلسلية المطلقة.أنواع المصادر الأخرى
يمكن التعامل مع مصادر الصوت الأخرى بالطريقة نفسها. على سبيل المثال، الإدخال الإضافي و مشغّل أقراص الصوت المضغوط
قد يعرض تطبيق واحد أنواعًا متعدّدة من المصادر. في هذه الحالات، ننصح بإنشاء MediaBrowserService منفصل لكل نوع من أنواع المصادر. حتى في عملية الإعداد التي تتضمّن مصادر معروضة/MediaBrowserServices متعددة، ننصح بشدة باستخدام جلسة MediaSession واحدة في تطبيق واحد.
قرص صوتي
يشبه هذا النوع من الأقراص أقراص Audio CD من حيث أنّ التطبيق الذي يعرض هذه الأقراص يعرض MediaBrowser بتسجيل واحد قابل للتصفّح (أو أكثر، إذا كان النظام يحتوي على مشغّل أقراص CD)، والذي سيحتوي بدوره على جميع الأغاني في قرص CD معيّن. إذا لم يكن لدى النظام معرفة بالمقاطع الصوتية على كل قرص مضغوط (على سبيل المثال، عند إدخال كل الأقراص في علبة في وقت واحد وعدم قراءتها كلها)، سيكون MediaItem للقرص بأكمله هو
PLAYABLE
فقط، وليسBROWSABLE
بالإضافة إلىPLAYABLE
. إذا لم يكن هناك قرص في خانة معيّنة، لن يكون العنصرPLAYABLE
ولاBROWSABLE
(ولكن يجب أن تكون كل خانة متوفّرة دائمًا في الشجرة).سيتم وضع علامة على هذه الإدخالات بطريقة مشابهة لتلك المُستخدَمة في مجلدات البث الإذاعي، وستتضمّن حقولًا إضافية أخرى محدّدة في MediaDescription API:
-
EXTRA_CD_TRACK
: لكلMediaItem
على قرص صوتي، رقم المقطع الصوتي بالاستناد إلى 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" على سلسلة فارغة. في اللغات غير الإنجليزية، ستظل علامة name هي السلسلة الإنجليزية نفسها. من غير المحتمل أن يكون الأمر كذلك، لأنّه بالنسبة إلىEXTRA_BCRADIO_BAND_NAME_EN
، تحدّد الشركة المصنّعة للجهاز القيم ولا يتم تحديدها وفقًا لقائمة محدّدة مسبقًا.إذا كان الجهاز قادرًا على رصد الأجهزة المتصلة بمنفذ 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 لأنواع المصادر التي تشكل جزءًا من هذا التصميم.
Broadcast radio MediaBrowserService (handles
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
- معرّف الموارد المنتظم (URI) لقناة ABC 88.1 HD1 (قابلة للتشغيل):
broadcastradio://program/HD_STATION_ID_EXT/158241DEADBEEF?AMFM_FREQUENCY=88100&RDS_PI=5678
- معرّف الموارد المنتظم (URI) لقناة ABC 88.1 HD2 (قابلة للتشغيل):
broadcastradio://program/HD_STATION_ID_EXT/158242DEADBEFE
- 90.5 FM (قابلة للتشغيل) - FM بدون RDSURI:
broadcastradio://program/AMFM_FREQUENCY/90500
- 620 AM (playable) URI:
broadcastradio://program/AMFM_FREQUENCY/620
- معرّف الموارد المنتظم (URI) لقناة BBC One (قابلة للتشغيل):
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"
- معرّف الموارد المنتظم (URI) لبثّ المحتوى بدقة 530 AM:
broadcastradio://program/AMFM_FREQUENCY/530
- معرّف الموارد المنتظم (URI) لبث الفيديو بدقة 540p (قابل للتشغيل):
broadcastradio://program/AMFM_FREQUENCY/540
- معرّف الموارد المنتظم (URI) لمحتوى 550 AM (قابل للتشغيل):
broadcastradio://program/AMFM_FREQUENCY/550
- معرّف الموارد المنتظم (URI) لبثّ المحتوى بدقة 530 AM:
- 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 (playable) URI:
broadcastradio://program/AMFM_FREQUENCY/88100
- 87.7 FM (قابلة للتشغيل) معرّف الموارد المنتظم (URI):
- DAB (قابلة للتشغيل):
EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="DAB"
Audio CD MediaBrowserService (المعروف باسم
ACTION_PLAY_AUDIOCD
):- القرص 1 (قابل للتشغيل)
EXTRA_CD_DISK=1
- القرص 2 (قابل للتصفّح والتشغيل)
EXTRA_CD_DISK=2
- المسار 1 (قابل للتشغيل)
EXTRA_CD_TRACK=1
- المقطع الصوتي 2 (قابل للتشغيل)
EXTRA_CD_TRACK=2
- المسار 1 (قابل للتشغيل)
- قرص الموسيقى الخاص بي (قابل للتصفّح والتشغيل)
EXTRA_CD_DISK=3
- All By Myself (playable)
EXTRA_CD_TRACK=1
- Reise, Reise (playable)
EXTRA_CD_TRACK=2
- All By Myself (playable)
- خانة فارغة 4 (لا يمكن تشغيلها)
EXTRA_CD_DISK=4
AUX MediaBrowserService (المعروف باسم
ACTION_PLAY_AUX
):- منفذ AUX الأمامي (قابل للتشغيل)
EXTRA_AUX_PORT_NAME="front"
- منفذ AUX في الخلف (قابل للتشغيل)
EXTRA_AUX_PORT_NAME="rear"