یک برنامه رسانه ای قالبی بسازید

برنامه‌های رسانه‌ای قالب‌بندی‌شده در مرحله بتا هستند
در حال حاضر، هر کسی می‌تواند برنامه‌های رسانه‌ای قالب‌بندی‌شده را برای آزمایش داخلی و تست‌های بسته در فروشگاه گوگل پلی منتشر کند. انتشار برای تست‌های باز و تست‌های تولید در تاریخ بعدی مجاز خواهد بود.

برنامه‌های رسانه‌ای با استفاده از قالب‌های کتابخانه برنامه خودرو می‌توانند تجربه مرور و پخش رسانه خود را سفارشی کنند، در حالی که اطمینان حاصل شود که این تجربه برای صفحه نمایش خودرو بهینه شده و حواس‌پرتی هنگام رانندگی را به حداقل می‌رساند.

این راهنما فرض می‌کند که شما از قبل یک برنامه رسانه‌ای دارید که صدا را روی تلفن پخش می‌کند و برنامه رسانه‌ای شما با معماری برنامه رسانه‌ای اندروید مطابقت دارد. کتابخانه برنامه خودرو به شما این امکان را می‌دهد که تجربه درون برنامه‌ای را با قالب‌هایی به جای قالب‌هایی که با استفاده از ساختار داده ساخت برنامه‌های رسانه‌ای برای خودروها MediaBrowser ساخته شده‌اند، جایگزین کنید. شما هنوز باید یک MediaSession برای کنترل‌های پخش و یک MediaBrowserService که برای توصیه‌ها و سایر تجربیات هوشمند استفاده می‌شود، ارائه دهید.

پیکربندی مانیفست برنامه شما

علاوه بر مراحل شرح داده شده در استفاده از کتابخانه برنامه اندروید برای خودروها ، موارد زیر برای برنامه‌های رسانه‌ای قالب‌بندی شده مورد نیاز است:

پشتیبانی از دسته‌بندی را در مانیفست خود اعلام کنید

برنامه شما باید دسته برنامه ماشین androidx.car.app.category.MEDIA را در فیلتر intent مربوط به 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>

حداقل سطح API برنامه خودرو را تنظیم کنید

برنامه‌های رسانه‌ای که از MediaPlaybackTemplate استفاده می‌کنند فقط در CAL API 8 پشتیبانی می‌شوند، مطمئن شوید که حداقل Car App API level شما روی ۸ تنظیم شده باشد.

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

اعلام پشتیبانی از اندروید اتو

مطمئن شوید که موارد زیر در مانیفست برنامه شما گنجانده شده است:

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

سپس، تعریف قالب را به 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 اطلاعات پخش رسانه را در کتابخانه برنامه خودرو (Car App Library) نمایش می‌دهد. این قالب امکان تنظیم یک سرصفحه (header) با عنوان و اقدامات قابل تنظیم را فراهم می‌کند، در حالی که اطلاعات رسانه و کنترل‌های پخش توسط میزبان و بر اساس وضعیت MediaSession برنامه شما پر می‌شوند.

یک پخش‌کننده موسیقی، آلبوم «آوای بهار» از مجموعه «سامر فیلدینگ» را به همراه تصویر مربعی زنی در حال نواختن گیتار پخش می‌کند.

شکل ۱: 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 با هم برای ایجاد طرح‌بندی‌هایی استفاده کنید که لیست‌هایی از تصاویر و موارد متنی را با هم ترکیب می‌کنند.

رابط کاربری برنامه موسیقی، آهنگ‌ها و آلبوم‌های اخیراً پخش‌شده را نمایش می‌دهد، که شامل دو ردیف عمودی و سه تصویر هنری آلبوم افقی است.

شکل ۲: یک 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 استفاده می‌کنید، می‌توانید با اضافه کردن یک دکمه‌ی عملیاتی شناور که شما را به صفحه‌ی پخش رسانه هدایت می‌کند ، به این هدف دست یابید. برای سایر قالب‌ها، یک اکشن هدر راه دیگری برای دستیابی به این هدف است.