تنفيذ التحكم اللاسلكي

يعتمد تنفيذ التحكم اللاسلكي على MediaSession و MediaBrowse التي تفعِّل تطبيقات الوسائط والمساعد الصوتي التحكم في الراديو. لمزيد من المعلومات، يُرجى مراجعة إنشاء تطبيقات وسائط للسيارات على developer.android.com.

يتوافر تنفيذ شجرة تصفح الوسائط في دعم راديو السيارة مكتبة في 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 يمكنك تشغيل أي محتوى من مجلد المستوى الأعلى. مثلاً، "تشغيل FM" أو "تشغيل الراديو".
  • onPlayFromUri تشغيل بمعدل تكرار محدَّد مثلاً، يمكن قول "تشغيل 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 له معرّف موارد منتظم يمكن استخدامه مع Mediasession لضبطها. كل مجلد من المستوى الأعلى (AM/FM/Programs) هو MediaItem له قيمة MediaId مع MediaSession لبدء التشغيل، ويخضع ذلك لتقدير المصنّع الأصلي للجهاز. بالنسبة مثلاً "تشغيل FM" "تشغيل صباحا" و"تشغيل الراديو" هي طلبات راديو غير محددة تستخدم MediaId لإرساله إلى تطبيق الراديو من المصنّع الأصلي للجهاز. يعود الأمر إلى تطبيق الراديو لتحديد المحتوى الذي سيتمّ تشغيله من طلب عام وmediaId.

جلسة الوسائط

نظرًا لعدم وجود مفهوم لإيقاف مجموعة البث مؤقتًا، سيتم اتخاذ إجراءات "التشغيل" و"الإيقاف المؤقت" و"الإيقاف" لا تنطبق دائمًا على الراديو. عند استخدام الراديو، يرتبط إجراء الإيقاف بكتم صوت البث بينما يتم ربط Play بإزالة كتم الصوت.

تتيح بعض موالفات الراديو (أو التطبيقات) محاكاة الإيقاف المؤقت للبث عن طريق التخزين المؤقت للمحتوى ثم تشغيله لاحقًا وفي هذه الحالات، يمكنك استخدام onPause.

يهدف التشغيل من إجراءات معرّف الموارد المنتظم (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 صباحًا في النطاق 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. معرِّف الموارد المنتظم (URI) (يُرجى الاطّلاع على أداة اختيار البرامج) أو MediaDescription.getTitle (إذا كان الإدخال في المجلد BROADCASTRADIO_FOLDER_TYPE_BAND).
    • المعرّفات الخاصة بالأجهزة اللاسلكية (RDS PI وDAB SId) تم تحليل MediaDescription.getMediaUri إلى ProgramSelector.

    عادةً، ليست هناك حاجة لجلب تردّد FM لإدخال على البرنامج الحالي أو قائمة المفضلة (حيث يجب أن يعمل العميل على الوسائط) المعرفات). ومع ذلك، إذا نشأت هذه الحاجة (لأغراض العرض مثلاً)، فمن موجودة في معرّف الموارد المنتظم (URI) ويمكن تحليلها إلى ProgramSelector. ومع ذلك، لا يُنصح باستخدام عنوان URI لتحديد عناصر داخل القائمة الحالية جلسة المراجعة. للحصول على التفاصيل، يمكنك مراجعة ProgramSelector

    لتجنّب المشكلات المتعلقة بالأداء أو المثبت، يجب أن تتيح خدمة MediaBrowser خيار تقسيم النتائج على عدّة صفحات:

    ملاحظة: يتم تنفيذ التقسيم على صفحات تلقائيًا في onLoadChildren() بدون معالجة الخيارات.

    الإدخالات ذات الصلة من جميع أنواع القوائم (القنوات الأولية والبرامج التي تم العثور عليها المفضلة) قد تحتوي على معرّفات MediaId مختلفة (يعود الأمر إلى تطبيق الراديو؛ دعم المكتبة مختلفة). تختلف معرّفات الموارد المنتظمة (URI) (في نموذج ProgramSelector) بين القنوات والبرامج الأولية المتوفّرة في معظم الحالات (باستثناء FM بدون RDS)، ولكنها متشابهة في الغالب بين البرامج المتوفرة والمفضلة (باستثناء على سبيل المثال، عند تحديث AF).

    يؤدي وجود معرّفات MediaId مختلفة للإدخالات من أنواع مختلفة من القوائم إلى اتخاذ إجراءات مختلفة بشأنها. يمكنك اجتياز قائمة "المفضّلة" أو قائمة كافة البرامج في onSkipToNext، اعتمادًا على المجلد الذي تم مؤخرًا تم تحديد MediaItem (راجع MediaSession).

    إجراءات الضبط الخاص

    تتيح قائمة البرامج للمستخدمين الضبط على محطة معيّنة، ولكنها لا تسمح للمستخدمين قد تؤدي إلى إجراء طلبات عامة مثل "الضبط على FM"، والتي قد تؤدي إلى توليف الاستماع إلى المحطة على فرقة FM.

    ولدعم هذه الإجراءات، تحتوي بعض الدلائل ذات المستوى الأعلى على FLAG_PLAYABLE مجموعة علامات (بالإضافة إلى FLAG_BROWSABLE للمجلدات).

    الإجراء يتم ضبطه على كيفية الإصدار
    تشغيل الراديو أي قناة راديو startService(ACTION_PLAY_BROADCASTRADIO)

    أو،

    playFromMediaId(MediaBrowser.getRoot())
    تَشْغِيلْ رَادْيُو FM أي قناة FM التشغيل من mediaId الخاصة بفرقة FM.

    يرجع تحديد البرنامج الذي يجب ضبطه إلى التطبيق. هذا هو عادةً ما تكون القناة التي تم ضبطها مؤخرًا على القناة من القائمة المحددة. للحصول على تفاصيل حول ACTION_PLAY_BROADCASTRADIO، عرض أهداف التشغيل العامة:

    الاكتشاف واتصال الخدمة

    بإمكان "PackageManager" العثور مباشرةً على جهاز MediaBrowserService الذي يعرض بثًا إذاعيًا. شَجَرَة لإجراء ذلك، يُرجى الاتصال على الرقم resolveService. بهدف ACTION_PLAY_BROADCASTRADIO (يُرجى الاطّلاع على أغراض اللعب العامة) و علم MATCH_SYSTEM_ONLY للعثور على جميع الخدمات التي تقدم خدمة الراديو (هناك أكثر من واحد؛ على سبيل المثال، فصل AM/FM والقمر الصناعي)، واستخدام queryIntentServices

    تعالج الخدمة التي تم حلّها الربط android.media.browse.MediaBrowserService. النية أيضًا. تم التحقّق من ذلك باستخدام GTS.

    للاتصال بخدمة MediaBrowserService المحدّدة إنشاء مثيل MediaBrowser لمكون خدمة معين وconnect. بعد إنشاء الاتصال، يمكن الحصول على اسم معرِّف لجلسة MediaSession من خلال getSessionToken

    يمكن لتطبيق الراديو تقييد حزم العميل المسموح لها بالاتصال في onGetRoot في تنفيذ خدمتهم. من المفترض أن يسمح التطبيق لتطبيقات النظام بالاتصال بدون الإضافة إلى القائمة البيضاء. للحصول على تفاصيل حول الإضافة إلى القائمة البيضاء، يمكنك الاطّلاع على قبول توقيع وحزمة تطبيق "مساعد Google"

    إذا كان التطبيق الخاص بالمصدر (مثل تطبيق الراديو) مثبّتًا على دون دعم المصدر المذكور، فستواصل الإعلان عن نفسها على أنها هدف 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

    إذا لم يكن السوار مدرَجًا في هذه القائمة، يجب عدم تحديد اسم السوار. ومع ذلك، إذا كان السوار مدرجًا في القائمة، يجب أن يكون له مجموعة علامات. لا يمكن للراديو عالي الدقة وتعداد نطاقات منفصلة لأنها تستخدم الوسيط الأساسي نفسه مثل AM/FM.

    أغراض عامة من أجل التشغيل

    يجب أن يعالج كل تطبيق مخصّص لتشغيل مصدر معيّن (مثل الراديو أو القرص المضغوط) هدف play عام بدء تشغيل بعض المحتوى الذي ربما من حالة غير نشطة (على سبيل المثال، بعد التشغيل). يعود الأمر إلى التطبيق في كيفية اختيار المحتوى ، ولكن عادةً ما يكون هو البرنامج الإذاعي أو مسار القرص المضغوط الذي تم تشغيله مؤخرًا.ويوجد الغرض المحدد لكل مصدر صوت:

    • android.car.intent.action.PLAY_BROADCASTRADIO
    • android.car.intent.action.PLAY_AUDIOCD: CD-DA أو CD-Text
    • android.car.intent.action.PLAY_DATADISC: قرص بيانات ضوئي مثل قرص مضغوط/قرص 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: تخزين الوسائط المحلية (فلاش مدمج)

    تم اختيار الأهداف لاستخدامها في أوامر التشغيل العامة، لأنها تحل مشكلتين في الوقت نفسه: أمر التشغيل العام نفسه واكتشاف الخدمة. وهناك فائدة إضافية لمثل هذا الغرض وهي إمكانية تنفيذ هذا النوع من الإجراءات. إجراء بسيط بدون فتح جلسة MediaBrowser.

    يُعد اكتشاف الخدمة في الواقع أهم مشكلة يتم حلها من خلال هذه الأهداف. إن إجراء اكتشاف الخدمة أمر سهل ولا لبس فيه بهذه الطريقة (راجع الاكتشاف واتصال الخدمة).

    لتسهيل بعض عمليات تنفيذ العملاء، هناك طريقة بديلة إصدار أمر Play هذا (ويجب أن ينفذه تطبيق الراديو أيضًا): إصدار playFromMediaId مع معرِّف الجذر للعقدة الجذر (مستخدَمة كـ MediaId). وفي حين أن العقدة الجذر لا يمكن أن تكون قابلة للتشغيل، لكنّ معرف الجذر الخاص بها هو سلسلة عشوائية والتي يمكن استهلاكها بتنسيق mediaId. ومع ذلك، لا يلزم العملاء لفهم هذا الفروق الدقيقة.

    أداة اختيار البرامج

    بما أنّ mediaId تكفي لاختيار قناة من MediaBrowserService، يصبح مرتبطًا بجلسة وغير متسق بين مزوّدي الخدمة. في بعض الحالات قد يحتاج العميل إلى مؤشر مطلق (مثل التكرار المطلق) للحفاظ عليه بين الجلسات والأجهزة.

    في عصر البث الإذاعي الرقمي، لا يكفي التردد المجرّد الضبط على محطة محددة. لذلك، استخدِم ProgramSelector لضبط إلى قناة تناظرية أو رقمية. يتكوّن ProgramSelector من جزأين:

    • المعرّف الأساسي: معرّف فريد وثابت لجهاز راديو معيَّن محطة لا تتغير ولكنها قد لا تكفي للتوليف لتلك المحطة. على سبيل المثال: رمز RDS PI، والذي قد تتم ترجمتها إلى علامة النداء في الولايات المتحدة.
    • المعرّفات الثانوية: معرّفات إضافية مفيدة في الضبط إلى هذه المحطة (مثل التردد)، وقد يشمل ذلك المعرّفات من تقنيات الراديو. على سبيل المثال، قد تشتمل محطة البث التلفزيوني الرقمي على جهاز احتياطي للبث التناظري.

    لتمكين 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) هذه على أجهزة الراديو التي تم إنشاؤها عليها ولا يمكن نقلها بين الأجهزة التي صنعها مختلف المصنّعين الأصليين للأجهزة.

    يجب تعيين معرفات الموارد المنتظمة (URI) هذه لكل MediaItem ضمن راديو المستوى الأعلى المجلدات. بالإضافة إلى ذلك، يجب أن تدعم جلسة MediaSession كلاً من playFromMediaId وplayFromUri. ولكن معرف الموارد المنتظم (URI) مخصص بشكل أساسي للراديو استخراج البيانات الوصفية (مثل تردد FM) والتخزين الدائم لا يوجد أن عنوان URI سيكون متاحًا لجميع عناصر الوسائط (على سبيل المثال، عندما يكون عنوان URL الأساسي نوع المعرّف غير متوافق بعد في إطار العمل). من ناحية أخرى، يعمل معرِّف الوسائط دائمًا. لا يُنصح بأن يستخدم العملاء معرّف الموارد المنتظم (URI) لاختيار عناصر من جلسة MediaBrowser الحالية. واستخدِم playFromMediaId بدلاً من ذلك. ومع ذلك، من المهم غير اختيارية لتطبيق العرض، ويتم حجز معرفات الموارد المنتظمة (URI) المفقودة للحالات المبررة.

    استخدم التصميم الأولي نقطتَين واحدة بدلاً من تسلسل :// بعد جزء المخطط. ومع ذلك، لا يتم دعم الطريقة الأولى من خلال android.net.Uri لمراجع URI الهرمية.

    أنواع المصادر الأخرى

    يمكن التعامل مع مصادر الصوت الأخرى بالطريقة نفسها. على سبيل المثال، إدخال البيانات الإضافية مشغّل القرص المضغوط الصوتي.

    قد يعرض تطبيق واحد أنواعًا متعددة من المصادر. في مثل هذه الحالات، يُنصَح بإنشاء خدمة MediaBrowserService منفصلة لكل نوع من أنواع المصادر. حتى في عملية الإعداد التي تتضمن مصادر متعددة/MediaBrowserServices ننصح بشدة بعقد جلسة MediaSession واحدة في جلسة واحدة التطبيق.

    قرص مضغوط صوتي

    على غرار القرص المضغوط الصوتي في أن التطبيق الذي يقدم هذه الأقراص سوف عرض MediaBrowser مع إدخال واحد قابل للتصفّح (أو أكثر، إذا كان النظام يحتوي على مغير القرص المضغوط)، والذي سوف يحتوي بدوره على جميع مسارات قرص مضغوط معين. إذا أكمل النظام ليس لديه معرفة بالمسارات الموجودة على كل قرص مضغوط (على سبيل المثال، عندما تكون جميع الأقراص تدخلها في خرطوشة مرة واحدة ولا تقرأها جميعًا)، عندها قد يكون MediaItem للقرص بأكمله PLAYABLE فقط، وليس BROWSABLE زائد PLAYABLE. إذا لم يكن هناك قرص في الخانة المحددة، لن يكون العنصر PLAYABLE أو BROWSABLE (ولكن يجب أن تكون كل خانة موجودة دائمًا في الشجرة).

     بنية شجرة القرص المضغوط الصوتي
    الشكل 3. بنية شجرة القرص المضغوط الصوتي.

    سيتم وضع علامة على هذه الإدخالات بالطريقة نفسها التي يتم بها وضع علامة على مجلدات الراديو هي: أن تحتوي على حقول إضافية إضافية محددة في واجهة برمجة تطبيقات MediaDescription:

    • EXTRA_CD_TRACK: لكل MediaItem على قرص مضغوط صوتي، رقم مسار مستنِد إلى رقم واحد.
    • EXTRA_CD_DISK: رقم قرص مستند إلى واحد

    بالنسبة إلى النظام الذي يدعم CD-Text والقرص المتوافق، فإن MediaItem ذو المستوى الأعلى على عنوان القرص. وبالمثل، سيكون لعناصر MediaItems للمقاطع الصوتية عنوان المقطع الصوتي.

    إدخال مساعد

    التطبيق الذي يعرض إدخالاً مساعدًا يعرض شجرة MediaBrowser بإدخال واحد (أو أكثر، عند وجود منافذ متعددة) تمثل AUX في المنفذ. تأخذ Mediasession المعنية MediaId والانتقال إلى هذا المصدر بعد تلقّي طلب playFromMediaId.

    بنية شجرة AUX
    الشكل 4. بنية شجرة AUX

    سيتضمن كل إدخال في MediaItem في AUX حقل إضافي تم ضبط EXTRA_AUX_PORT_NAME على الاسم غير المترجَم للمنفذ. بدون "AUX" عبارة. على سبيل المثال، "AUX 1" يجب ضبطها على "1"، و"AUX". الأمامية" إلى "الأمام" و"AUX" إلى سلسلة فارغة. في اللغات غير الإنجليزية، لا يكون الاسم العلامة ستبقى نفس السلسلة الإنجليزية. من غير المرجّح أن يكون 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 لأنواع المصادر جزء من هذا التصميم.

    بث الراديو 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
      • معرّف الموارد المنتظم (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
      • معرّف الموارد المنتظم (URI) 620 AM (قابل للتشغيل): broadcastradio://program/AMFM_FREQUENCY/620
      • معرّف الموارد المنتظم (URI) لـ BBC One (قابل للتشغيل): 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
      • معرّف الموارد المنتظم (URI) لـ BBC Two (غير قابل للتشغيل): broadcastradio://program/RDS_PI/1300?AMFM_FREQUENCY=102100
    • AM (قابل للتصفّح والتشغيل): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="AM"
      • معرّف الموارد المنتظم (URI) 530 AM (قابل للتشغيل): broadcastradio://program/AMFM_FREQUENCY/530
      • معرّف الموارد المنتظم (URI) 540 AM (قابل للتشغيل): broadcastradio://program/AMFM_FREQUENCY/540
      • معرّف الموارد المنتظم (URI) 550 AM (قابل للتشغيل): 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
      • معرّف الموارد المنتظم (URI) لـ 88.1 FM (قابل للتشغيل): broadcastradio://program/AMFM_FREQUENCY/88100
    • DAB (قابل للتشغيل): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="DAB"

    Media 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"