إنشاء تطبيق وسائط مستند إلى نموذج

تطبيقات الوسائط المستندة إلى النماذج في مرحلة تجريبية
في الوقت الحالي، يمكن لأي مستخدم نشر تطبيقات الوسائط المستندة إلى النماذج في مسارات الاختبار الداخلي والاختبار المغلق على "متجر Play". سيتم السماح بالنشر في مسارات الاختبار المفتوح وقنوات الإصدار العلني في تاريخ لاحق.

يمكن لتطبيقات الوسائط التي تستخدم نماذج "مكتبة تطبيقات السيارات" تخصيص تجربة تصفُّح الوسائط وتشغيلها مع ضمان تحسين التجربة لتتوافق مع شاشات السيارات والحدّ من مصادر التشتيت أثناء القيادة.

يفترض هذا الدليل أنّ لديك تطبيق وسائط يشغّل الصوت على الهاتف ويتوافق مع بنية تطبيق وسائط Android. تتيح لك مكتبة تطبيقات السيارات إمكانية استبدال التجربة داخل التطبيق باستخدام النماذج بدلاً من تلك التي تم إنشاؤها باستخدام بنية بيانات إنشاء تطبيقات وسائط للسيارات MediaBrowser. لا يزال عليك توفير MediaSession لعناصر التحكّم في التشغيل وMediaBrowserService، الذي يُستخدَم ل الاقتراحات والتجارب الذكية الأخرى.

ضبط ملف بيان تطبيقك

بالإضافة إلى الخطوات الموضّحة في مقالة استخدام مكتبة تطبيقات "Android للسيارات"، يجب استيفاء المتطلبات التالية في تطبيقات الوسائط المستندة إلى النماذج:

تحديد فئات التطبيقات المتوافقة في البيان

يجب أن يعرِّف تطبيقك androidx.car.app.category.MEDIA فئة تطبيقات السيارات في فلتر الأهداف الخاص بنشاط CarAppService.

<application>
    ...
   <service
       ...
        android:name=".MyCarAppService"
        android:exported="true">
      <intent-filter>
        <action android:name="androidx.car.app.CarAppService" />
        <category android:name="androidx.car.app.category.MEDIA"/>
      </intent-filter>
    </service>
    ...
<application>

للوصول إلى MediaPlaybackTemplate، يجب أن يُدرج تطبيقك أيضًا إذن androidx.car.app.MEDIA_TEMPLATES فيملفه البياني:

<manifest ...>
  ...
  <uses-permission android:name="androidx.car.app.MEDIA_TEMPLATES"/>
  ...
</manifest>

ضبط الحد الأدنى لمستوى واجهة برمجة التطبيقات لتطبيق السيارة

لا تتوفّر تطبيقات الوسائط التي تستخدم MediaPlaybackTemplate إلا في CAL API 8، لذا تأكَّد من ضبط الحد الأدنى من Car App API level على 8.

<application ...>
  ...
  <meta-data
    android:name="androidx.car.app.minCarApiLevel"
    android:value="8"/>
  ...
</application>

الإفصاح عن توافق التطبيق مع Android Auto

تأكَّد من تضمين ما يلي في بيان تطبيقك:

<application>
  ...
  <meta-data android:name="com.google.android.gms.car.application"
      android:resource="@xml/automotive_app_desc"/>
  ...
</application>

بعد ذلك، أضِف بيان template إلى automotive_app_desc.xml في xml resources. من المفترض أن يظهر الرمز على النحو التالي:

<automotiveApp xmlns:android="http://schemas.android.com/apk/res/android">
 <uses name="media"/>
 <uses name="template"/>
</automotiveApp>

تقديم رمز تحديد المصدر

احرص على إضافة رمز تحديد المصدر لتطبيقات الوسائط التي تم إنشاؤها باستخدام مكتبة تطبيقات السيارات.

إتاحة الإجراءات الصوتية

يمكنك تفعيل ميزة "التحكم بالصوت" في تطبيقك للسماح للمستخدمين بإكمال الإجراءات الشائعة بدون لمس الجهاز. اطّلِع على إتاحة الإجراءات الصوتية للوسائط للحصول على تعليمات تنفيذ أكثر تفصيلاً. باستخدام تطبيق وسائط مستند إلى النماذج، إذا تلقّيت طلبًا صوتيًا، لن تحتاج إلى تعديل MediaBrowserService باستخدام نتائج البحث. بدلاً من ذلك، ننصحك بإضافة إجراء في نموذج تشغيل الوسائط للسماح للمستخدم بمحاولة العثور على المزيد من المحتوى استنادًا إلى طلب التشغيل أو البحث هذا. يجب أن تتيح الأوامر الصوتية استيفاء إرشادات الجودة في VC-1.

إنشاء نموذج التشغيل

يعرض MediaPlaybackTemplate معلومات تشغيل الوسائط في تطبيق الوسائط ضمن "مكتبة تطبيقات السيارات". يتيح هذا النموذج ضبط عنوان يحتوي على عنوان وإجراءات قابلة للتخصيص، بينما يملؤه المضيف بمعلومات الوسائط وعناصر التحكّم في التشغيل استنادًا إلى حالة MediaSession في تطبيقك.

يعرض مشغّل الموسيقى أغنية Sounds of Spring من تأليف Summer Fielding مع
     صورة مربّعة لامرأة تعزف على الغيتار.

الشكل 1: MediaPlaybackTemplate مع إجراء عنوان لفتح الطابور في أعلى الصفحة

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

val playbackTemplate = MediaPlaybackTemplate.Builder()
      .setHeader(
        Header.Builder()
          .setStartHeaderAction(Action.BACK)
          .addEndHeaderAction(
                Action.Builder()
                  .setTitle(model.context.getString(R.string.queue_button_title))
                  .setIcon(
                    CarIcon.Builder(
                        IconCompat.createWithResource(
                          model.context,
                          R.drawable.gs_queue_music_vd_theme_24,
                        ))
                      .build())
                  .setOnClickListener(showQueueScreen())
                  .build())
          .setTitle(model.context.getString(R.string.media_playback_view_title))
          .build())
      .build()

عند استخدام MediaPlaybackTemplate، سجِّل رمز MediaSession باستخدام MediaPlaybackManager في CarAppService. وفي حال عدم إجراء ذلك، سيؤدي ذلك إلى ظهور خطأ عند إرسال MediaPlaybackTemplate إلى المضيف.

import androidx.car.app.media.MediaPlaybackManager


override fun onCreateSession(sessionInfo: SessionInfo): Session {
    return object : Session() {
        

        init {
          lifecycle.addObserver(
            LifecycleEventObserver { _, event ->
              if (event == ON_CREATE) {
                val token = ... // MediaSessionCompat.Token
                (carContext.getCarService(CarContext.MEDIA_PLAYBACK_SERVICE) as MediaPlaybackManager)
                  .registerMediaPlaybackToken(token)
              }
              ...
            }
          )
        }
    }
}

.registerMediaPlaybackToken ضروري لعرض معلومات التحكّم في تشغيل الوسائط على Android Auto. من المهم أيضًا أن ينشئ المضيف إشعارات خاصة بالوسائط.

تنظيم الوسائط باستخدام النماذج

لتنظيم الوسائط بهدف تصفّحها، مثل الأغاني أو الألبومات، ننصحك باستخدام رمز SectionedItemTemplate، الذي يتيح لك استخدام رمزَي GridSection و RowSection معًا لإنشاء تنسيقات تمزج بين قوائم الصور وعناصر النصوص.

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

الشكل 2: SectionedItemTemplate يحتوي على RowSection يتبعه GridSection

استخدام عنصر SectionedItemTemplate داخل عنصر TabTemplate

من الطرق المُلائمة لتصنيف الوسائط داخل تطبيقك هي استخدام الرمز SectionedItemTemplate داخل الرمز TabTemplate.

val template =
      SectionedItemTemplate.Builder()...build();
val tabTemplate = 
      TabTemplate.Builder(tabCallback)
          .setTabContents(TabContents.Builder(template).build)
          .setHeaderAction(Action.APP_ICON)
          
          .build();

لمزيد من التفاصيل حول كيفية تصميم واجهة مستخدم تطبيق الوسائط باستخدام هذه التصاميم، يُرجى الاطّلاع على مقالة تطبيقات الوسائط.

عند تصفّح الوسائط، من المهم أن يتمكّن المستخدم من الانتقال بسرعة إلى MediaPlaybackTemplate بأقل قدر من التشتيت. لاستيفاء متطلبات جودة MFT-1، يجب أن يتضمّن تطبيقك طريقة للوصول إلى MediaPlaybackTemplate من جميع شاشات تصفّح الوسائط.

إذا كنت تستخدم SectionedItemTemplate، يمكنك إجراء ذلك من خلال إضافة زر إجراء عائم ينقلك إلى شاشة تشغيل الوسائط. بالنسبة إلى النماذج الأخرى، يُعدّ إجراء العنوان طريقة أخرى لتحقيق ذلك.