اعمال سبک های محتوا

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

فهرست موارد

شکل 1. موارد فهرست، عناوین و ابرداده ها را بر تصاویر اولویت می دهند.

آیتم های شبکه

شکل 2. آیتم های گرید تصاویر را بر عناوین و ابرداده ها اولویت می دهند.

سبک های محتوای پیش فرض را تنظیم کنید

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

این موارد اضافی را می توان به عنوان کلید در بسته استفاده کرد:

این کلیدها می توانند به این مقادیر ثابت اعداد صحیح نگاشت شوند تا بر ارائه آن موارد تأثیر بگذارند:

  • DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_LIST_ITEM : موارد مربوطه به عنوان موارد فهرست ارائه شده است.

  • DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_GRID_ITEM : موارد مربوطه به عنوان موارد شبکه ارائه شده است.

  • DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_CATEGORY_LIST_ITEM : موارد مربوطه به عنوان آیتم های فهرست «دسته» ارائه می شوند، مشابه موارد فهرست معمولی، اما حاشیه ها در اطراف نمادهای آیتم ها اعمال می شوند. این باعث بهبود ظاهر آیکون های کوچک می شود. نمادها باید بردار قابل طرح‌بندی باشند. انتظار می رود این راهنمایی فقط برای موارد قابل مرور ارائه شود.

  • DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_CATEGORY_GRID_ITEM : موارد مربوطه به عنوان آیتم های شبکه ای "رده" ارائه می شوند و شبیه موارد شبکه معمولی هستند، اما حاشیه ها در اطراف نمادهای آیتم ها اعمال می شوند. این باعث بهبود ظاهر آیکون های کوچک می شود. نمادها باید بردار قابل ترسیم باشند. انتظار می رود این راهنمایی فقط برای موارد قابل مرور ارائه شود.

این قطعه کد نحوه تنظیم سبک محتوای پیش فرض را برای موارد قابل مرور به شبکه و موارد قابل پخش در لیست ها نشان می دهد:

کاتلین

import androidx.media.utils.MediaConstants

@Nullable
override fun onGetRoot(
    @NonNull clientPackageName: String,
    clientUid: Int,
    @Nullable rootHints: Bundle
): BrowserRoot {
    val extras = Bundle()
    extras.putInt(
        MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_BROWSABLE,
        MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_GRID_ITEM)
    extras.putInt(
        MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE,
        MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_LIST_ITEM)
    return BrowserRoot(ROOT_ID, extras)
}

جاوا

import androidx.media.utils.MediaConstants;

@Nullable
@Override
public BrowserRoot onGetRoot(
    @NonNull String clientPackageName,
    int clientUid,
    @Nullable Bundle rootHints) {
    Bundle extras = new Bundle();
    extras.putInt(
        MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_BROWSABLE,
        MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_GRID_ITEM);
    extras.putInt(
        MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE,
        MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_LIST_ITEM);
    return new BrowserRoot(ROOT_ID, extras);
}

سبک محتوای هر مورد را تنظیم کنید

می‌توانید سبک محتوای پیش‌فرض را برای نوادگان هر مورد رسانه قابل مرور و همچنین برای هر مورد رسانه لغو کنید. برای لغو پیش‌فرض برای نوادگان یک آیتم رسانه قابل مرور، یک بسته اضافی در MediaDescription مورد رسانه ایجاد کنید و همان نکات ذکر شده قبلی را اضافه کنید:

  • DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE برای فرزندان قابل پخش آن مورد اعمال می شود.

  • DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_BROWSABLE برای نوادگان قابل مرور آن مورد اعمال می شود.

برای لغو پیش‌فرض برای یک آیتم رسانه خاص (نه فرزندان آن)، یک بسته اضافی در MediaDescription مورد رسانه ایجاد کنید. سپس با کلید DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_SINGLE_ITEM یک راهنمایی اضافه کنید. از همان مقادیری که قبلا توضیح داده شد برای مشخص کردن ارائه آن مورد استفاده کنید.

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

کاتلین

import androidx.media.utils.MediaConstants

private fun createBrowsableMediaItem(
    mediaId: String,
    folderName: String,
    iconUri: Uri
): MediaBrowser.MediaItem {
    val mediaDescriptionBuilder = MediaDescription.Builder()
    mediaDescriptionBuilder.setMediaId(mediaId)
    mediaDescriptionBuilder.setTitle(folderName)
    mediaDescriptionBuilder.setIconUri(iconUri)
    val extras = Bundle()
    extras.putInt(
        MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_SINGLE_ITEM,
        MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_CATEGORY_LIST_ITEM)
    extras.putInt(
        MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_BROWSABLE,
        MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_LIST_ITEM)
    extras.putInt(
        MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE,
        MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_GRID_ITEM)
    mediaDescriptionBuilder.setExtras(extras)
    return MediaBrowser.MediaItem(
        mediaDescriptionBuilder.build(), MediaBrowser.MediaItem.FLAG_BROWSABLE)
}

جاوا

import androidx.media.utils.MediaConstants;

private MediaBrowser.MediaItem createBrowsableMediaItem(
    String mediaId,
    String folderName,
    Uri iconUri) {
    MediaDescription.Builder mediaDescriptionBuilder = new MediaDescription.Builder();
    mediaDescriptionBuilder.setMediaId(mediaId);
    mediaDescriptionBuilder.setTitle(folderName);
    mediaDescriptionBuilder.setIconUri(iconUri);
    Bundle extras = new Bundle();
    extras.putInt(
        MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_SINGLE_ITEM,
        MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_CATEGORY_LIST_ITEM);
    extras.putInt(
        MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_BROWSABLE,
        MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_LIST_ITEM);
    extras.putInt(
        MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE,
        MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_GRID_ITEM);
    mediaDescriptionBuilder.setExtras(extras);
    return new MediaBrowser.MediaItem(
        mediaDescriptionBuilder.build(), MediaBrowser.MediaItem.FLAG_BROWSABLE);
}

موارد را با استفاده از نکات عنوان گروه بندی کنید

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

این قطعه کد نحوه ایجاد یک MediaItem با عنوان زیرگروه Songs را نشان می دهد:

کاتلین

import androidx.media.utils.MediaConstants

private fun createMediaItem(
    mediaId: String,
    folderName: String,
    iconUri: Uri
): MediaBrowser.MediaItem {
    val mediaDescriptionBuilder = MediaDescription.Builder()
    mediaDescriptionBuilder.setMediaId(mediaId)
    mediaDescriptionBuilder.setTitle(folderName)
    mediaDescriptionBuilder.setIconUri(iconUri)
    val extras = Bundle()
    extras.putString(
        MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE,
        "Songs")
    mediaDescriptionBuilder.setExtras(extras)
    return MediaBrowser.MediaItem(
        mediaDescriptionBuilder.build(), /* playable or browsable flag*/)
}

جاوا

import androidx.media.utils.MediaConstants;

private MediaBrowser.MediaItem createMediaItem(String mediaId, String folderName, Uri iconUri) {
   MediaDescription.Builder mediaDescriptionBuilder = new MediaDescription.Builder();
   mediaDescriptionBuilder.setMediaId(mediaId);
   mediaDescriptionBuilder.setTitle(folderName);
   mediaDescriptionBuilder.setIconUri(iconUri);
   Bundle extras = new Bundle();
   extras.putString(
       MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE,
       "Songs");
   mediaDescriptionBuilder.setExtras(extras);
   return new MediaBrowser.MediaItem(
       mediaDescriptionBuilder.build(), /* playable or browsable flag*/);
}

برنامه شما باید همه موارد رسانه‌ای را که می‌خواهید با هم به‌عنوان یک بلوک پیوسته گروه‌بندی کنید، ارسال کند. برای مثال، نمایش دو گروه از آیتم های رسانه ای، «آهنگ ها» و «آلبوم ها» را به ترتیب در نظر بگیرید. اگر برنامه شما پنج مورد رسانه را به این ترتیب ارسال کند، Android Auto و AAOS آنها را به عنوان چهار گروه جداگانه تفسیر می‌کنند:

  • مورد رسانه A با extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs")
  • مورد رسانه B با extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Albums")
  • مورد رسانه C با extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs")
  • مورد رسانه D با extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs")
  • مورد رسانه E با extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Albums")

در نتیجه این چهار گروه به وجود می آیند:

  • گروه 1، به نام "ترانه ها"، حاوی آیتم رسانه ای A
  • گروه 2، به نام "آلبوم"، حاوی آیتم رسانه ای B
  • گروه 3، به نام "ترانه ها"، حاوی آیتم های رسانه ای C و D
  • گروه 4، به نام "آلبوم"، حاوی آیتم رسانه ای E

برای نمایش این موارد در دو گروه، برنامه شما باید موارد رسانه را به ترتیب زیر ارسال کند:

  • مورد رسانه A با extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs")
  • مورد رسانه C با extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs")
  • مورد رسانه D با extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs")
  • مورد رسانه B با extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Albums")
  • مورد رسانه E با extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Albums")

نشانگرهای فراداده اضافی را نمایش دهید

می توانید شاخص های فراداده اضافی را برای ارائه اطلاعات در یک نگاه برای محتوا در درخت مرورگر رسانه و در حین پخش اضافه کنید.

در درخت مرور، Android Auto و AAOS موارد اضافی مرتبط با یک مورد را می خوانند و نشانگرها را نمایش می دهند. در حین پخش رسانه، Android Auto و AAOS فراداده‌های جلسه رسانه را می‌خوانند و به دنبال ثابت‌های خاصی می‌گردند تا مشخص کنند کدام شاخص‌ها را نمایش دهند.

نمایش پخش با ابرداده

شکل 3. نمای پخش با ابرداده.

برای محتوای پخش نشده، نمای را مرور کنید.

شکل 4. نمای محتوای پخش نشده را مرور کنید.

این ثابت ها را می توان هم در توضیحات اضافی MediaItem و هم در موارد اضافی MediaMetadata استفاده کرد:

  • EXTRA_DOWNLOAD_STATUS : وضعیت دانلود یک مورد را نشان می دهد. از این ثابت به عنوان کلید استفاده کنید. این ثابت های طولانی مقادیر ممکن است:

  • METADATA_KEY_IS_EXPLICIT : نشان می دهد که مورد حاوی محتوای صریح است. برای نشان دادن صریح بودن یک مورد، از این ثابت به عنوان کلید و METADATA_VALUE_ATTRIBUTE_PRESENT طولانی به عنوان مقدار استفاده کنید.

این ثابت ها را فقط می توان در توضیحات اضافی MediaItem استفاده کرد:

برای نمایش نشانگرهایی که در حالی که کاربر در حال مرور درخت مرور رسانه است ظاهر می شوند، یک بسته اضافی ایجاد کنید که شامل یک یا چند مورد از این ثابت ها باشد. سپس، آن بسته را به متد MediaDescription.Builder.setExtras منتقل کنید.

این قطعه نحوه نمایش نشانگرها را برای یک مورد رسانه صریح که 70٪ کامل است نشان می دهد:

کاتلین

import androidx.media.utils.MediaConstants

val extras = Bundle()
extras.putLong(
    MediaConstants.METADATA_KEY_IS_EXPLICIT,
    MediaConstants.METADATA_VALUE_ATTRIBUTE_PRESENT)
extras.putInt(
    MediaConstants.DESCRIPTION_EXTRAS_KEY_COMPLETION_STATUS,
    MediaConstants.DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_PARTIALLY_PLAYED)
extras.putDouble(
    MediaConstants.DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE, 0.7)
val description =
    MediaDescriptionCompat.Builder()
        .setMediaId(/*...*/)
        .setTitle(resources.getString(/*...*/))
        .setExtras(extras)
        .build()
return MediaBrowserCompat.MediaItem(description, /* flags */)

جاوا

import androidx.media.utils.MediaConstants;

Bundle extras = new Bundle();
extras.putLong(
    MediaConstants.METADATA_KEY_IS_EXPLICIT,
    MediaConstants.METADATA_VALUE_ATTRIBUTE_PRESENT);
extras.putInt(
    MediaConstants.DESCRIPTION_EXTRAS_KEY_COMPLETION_STATUS,
    MediaConstants.DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_PARTIALLY_PLAYED);
extras.putDouble(
    MediaConstants.DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE, 0.7);
MediaDescriptionCompat description =
    new MediaDescriptionCompat.Builder()
        .setMediaId(/*...*/)
        .setTitle(resources.getString(/*...*/))
        .setExtras(extras)
        .build();
return new MediaBrowserCompat.MediaItem(description, /* flags */);

برای نمایش نشانگرهای مورد رسانه ای که در حال پخش است، مقادیر METADATA_KEY_IS_EXPLICIT یا EXTRA_DOWNLOAD_STATUS را در mediaSession MediaMetadataCompat خود اعلام کنید.

این قطعه کد نحوه نشان دادن صریح بودن و بارگیری آهنگ در نمای پخش را نشان می دهد:

کاتلین

import androidx.media.utils.MediaConstants

mediaSession.setMetadata(
    MediaMetadataCompat.Builder()
        .putString(
            MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, "Song Name")
        .putString(
            MediaMetadataCompat.METADATA_KEY_DISPLAY_SUBTITLE, "Artist name")
        .putString(
            MediaMetadataCompat.METADATA_KEY_ALBUM_ART_URI,
            albumArtUri.toString())
        .putLong(
            MediaConstants.METADATA_KEY_IS_EXPLICIT,
            MediaConstants.METADATA_VALUE_ATTRIBUTE_PRESENT)
        .putLong(
            MediaDescriptionCompat.EXTRA_DOWNLOAD_STATUS,
            MediaDescriptionCompat.STATUS_DOWNLOADED)
        .build())

جاوا

import androidx.media.utils.MediaConstants;

mediaSession.setMetadata(
    new MediaMetadataCompat.Builder()
        .putString(
            MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, "Song Name")
        .putString(
            MediaMetadataCompat.METADATA_KEY_DISPLAY_SUBTITLE, "Artist name")
        .putString(
            MediaMetadataCompat.METADATA_KEY_ALBUM_ART_URI,
            albumArtUri.toString())
        .putLong(
            MediaConstants.METADATA_KEY_IS_EXPLICIT,
            MediaConstants.METADATA_VALUE_ATTRIBUTE_PRESENT)
        .putLong(
            MediaDescriptionCompat.EXTRA_DOWNLOAD_STATUS,
            MediaDescriptionCompat.STATUS_DOWNLOADED)
        .build());

هنگام پخش محتوا، نوار پیشرفت را در نمای مرور به‌روزرسانی کنید

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

برای اینکه Android Auto و AAOS نوار پیشرفت را به‌روز نگه دارند، اطلاعات بیشتری را در MediaMetadataCompat و PlaybackStateCompat ارائه کنید تا محتوای در حال انجام را به موارد رسانه در نمای مرور پیوند دهید.

برای اینکه یک آیتم رسانه نوار پیشرفت به‌روزرسانی خودکار داشته باشد، باید این شرایط رعایت شود:

این قطعه کد نشان می دهد که چگونه می توان نشان داد که آیتم در حال پخش به یک مورد در نمای مرور مرتبط است:

کاتلین

import androidx.media.utils.MediaConstants

// When the MediaItem is constructed to show in the browse view.
// Suppose the item was 25% complete when the user launched the browse view.
val mediaItemExtras = Bundle()
mediaItemExtras.putDouble(
    MediaConstants.DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE, 0.25)
val description =
    MediaDescriptionCompat.Builder()
        .setMediaId("my-media-id")
        .setExtras(mediaItemExtras)
        // ...and any other setters.
        .build()
return MediaBrowserCompat.MediaItem(description, /* flags */)

// Elsewhere, when the user has selected MediaItem for playback.
mediaSession.setMetadata(
    MediaMetadataCompat.Builder()
        .putString(MediaMetadata.METADATA_KEY_MEDIA_ID, "my-media-id")
        // ...and any other setters.
        .build())

val playbackStateExtras = Bundle()
playbackStateExtras.putString(
    MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_MEDIA_ID, "my-media-id")
mediaSession.setPlaybackState(
    PlaybackStateCompat.Builder()
        .setExtras(playbackStateExtras)
        // ...and any other setters.
        .build())

جاوا

import androidx.media.utils.MediaConstants;

// When the MediaItem is constructed to show in the browse view.
// Suppose the item was 25% complete when the user launched the browse view.
Bundle mediaItemExtras = new Bundle();
mediaItemExtras.putDouble(
    MediaConstants.DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE, 0.25);
MediaDescriptionCompat description =
    new MediaDescriptionCompat.Builder()
        .setMediaId("my-media-id")
        .setExtras(mediaItemExtras)
        // ...and any other setters.
        .build();
return new MediaBrowserCompat.MediaItem(description, /* flags */);

// Elsewhere, when the user has selected MediaItem for playback.
mediaSession.setMetadata(
    new MediaMetadataCompat.Builder()
        .putString(MediaMetadata.METADATA_KEY_MEDIA_ID, "my-media-id")
        // ...and any other setters.
        .build());

Bundle playbackStateExtras = new Bundle();
playbackStateExtras.putString(
    MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_MEDIA_ID, "my-media-id");
mediaSession.setPlaybackState(
    new PlaybackStateCompat.Builder()
        .setExtras(playbackStateExtras)
        // ...and any other setters.
        .build());

P حتی محتوای پخش نشده یا به طور کامل پخش شده می تواند نوار پیشرفت به روز رسانی خودکار را نمایش دهد. اگر موارد رسانه مربوطه شامل DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE اضافی با مقدار 0.0 (برای پخش نشده) یا 1.0 (برای پخش کامل) باشد. پس از اینکه کاربر این موارد رسانه ای را انتخاب کرد، Android Auto و AAOS نوار پیشرفت را بر روی سایر نشانگرهای پیشرفت نمایش می دهند.

،

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

فهرست موارد

شکل 1. موارد فهرست، عناوین و ابرداده ها را بر تصاویر اولویت می دهند.

آیتم های شبکه

شکل 2. آیتم های گرید تصاویر را بر عناوین و ابرداده ها اولویت می دهند.

سبک های محتوای پیش فرض را تنظیم کنید

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

این موارد اضافی را می توان به عنوان کلید در بسته استفاده کرد:

این کلیدها می توانند به این مقادیر ثابت اعداد صحیح نگاشت شوند تا بر ارائه آن موارد تأثیر بگذارند:

  • DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_LIST_ITEM : موارد مربوطه به عنوان موارد فهرست ارائه شده است.

  • DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_GRID_ITEM : موارد مربوطه به عنوان موارد شبکه ارائه شده است.

  • DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_CATEGORY_LIST_ITEM : موارد مربوطه به عنوان آیتم های فهرست «دسته» ارائه می شوند، مشابه موارد فهرست معمولی، اما حاشیه ها در اطراف نمادهای آیتم ها اعمال می شوند. این باعث بهبود ظاهر آیکون های کوچک می شود. نمادها باید بردار قابل طرح‌بندی باشند. انتظار می رود این راهنمایی فقط برای موارد قابل مرور ارائه شود.

  • DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_CATEGORY_GRID_ITEM : موارد مربوطه به عنوان آیتم های شبکه ای "رده" ارائه می شوند و شبیه موارد شبکه معمولی هستند، اما حاشیه ها در اطراف نمادهای آیتم ها اعمال می شوند. این باعث بهبود ظاهر آیکون های کوچک می شود. نمادها باید بردار قابل ترسیم باشند. انتظار می رود این راهنمایی فقط برای موارد قابل مرور ارائه شود.

این قطعه کد نحوه تنظیم سبک محتوای پیش فرض را برای موارد قابل مرور به شبکه و موارد قابل پخش در لیست ها نشان می دهد:

کاتلین

import androidx.media.utils.MediaConstants

@Nullable
override fun onGetRoot(
    @NonNull clientPackageName: String,
    clientUid: Int,
    @Nullable rootHints: Bundle
): BrowserRoot {
    val extras = Bundle()
    extras.putInt(
        MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_BROWSABLE,
        MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_GRID_ITEM)
    extras.putInt(
        MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE,
        MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_LIST_ITEM)
    return BrowserRoot(ROOT_ID, extras)
}

جاوا

import androidx.media.utils.MediaConstants;

@Nullable
@Override
public BrowserRoot onGetRoot(
    @NonNull String clientPackageName,
    int clientUid,
    @Nullable Bundle rootHints) {
    Bundle extras = new Bundle();
    extras.putInt(
        MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_BROWSABLE,
        MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_GRID_ITEM);
    extras.putInt(
        MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE,
        MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_LIST_ITEM);
    return new BrowserRoot(ROOT_ID, extras);
}

سبک محتوای هر مورد را تنظیم کنید

می‌توانید سبک محتوای پیش‌فرض را برای نوادگان هر مورد رسانه قابل مرور و همچنین برای هر مورد رسانه لغو کنید. برای لغو پیش‌فرض برای نوادگان یک آیتم رسانه قابل مرور، یک بسته اضافی در MediaDescription مورد رسانه ایجاد کنید و همان نکات ذکر شده قبلی را اضافه کنید:

  • DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE برای فرزندان قابل پخش آن مورد اعمال می شود.

  • DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_BROWSABLE برای نوادگان قابل مرور آن مورد اعمال می شود.

برای لغو پیش‌فرض برای یک آیتم رسانه خاص (نه فرزندان آن)، یک بسته اضافی در MediaDescription مورد رسانه ایجاد کنید. سپس با کلید DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_SINGLE_ITEM یک راهنمایی اضافه کنید. از همان مقادیری که قبلا توضیح داده شد برای مشخص کردن ارائه آن مورد استفاده کنید.

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

کاتلین

import androidx.media.utils.MediaConstants

private fun createBrowsableMediaItem(
    mediaId: String,
    folderName: String,
    iconUri: Uri
): MediaBrowser.MediaItem {
    val mediaDescriptionBuilder = MediaDescription.Builder()
    mediaDescriptionBuilder.setMediaId(mediaId)
    mediaDescriptionBuilder.setTitle(folderName)
    mediaDescriptionBuilder.setIconUri(iconUri)
    val extras = Bundle()
    extras.putInt(
        MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_SINGLE_ITEM,
        MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_CATEGORY_LIST_ITEM)
    extras.putInt(
        MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_BROWSABLE,
        MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_LIST_ITEM)
    extras.putInt(
        MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE,
        MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_GRID_ITEM)
    mediaDescriptionBuilder.setExtras(extras)
    return MediaBrowser.MediaItem(
        mediaDescriptionBuilder.build(), MediaBrowser.MediaItem.FLAG_BROWSABLE)
}

جاوا

import androidx.media.utils.MediaConstants;

private MediaBrowser.MediaItem createBrowsableMediaItem(
    String mediaId,
    String folderName,
    Uri iconUri) {
    MediaDescription.Builder mediaDescriptionBuilder = new MediaDescription.Builder();
    mediaDescriptionBuilder.setMediaId(mediaId);
    mediaDescriptionBuilder.setTitle(folderName);
    mediaDescriptionBuilder.setIconUri(iconUri);
    Bundle extras = new Bundle();
    extras.putInt(
        MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_SINGLE_ITEM,
        MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_CATEGORY_LIST_ITEM);
    extras.putInt(
        MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_BROWSABLE,
        MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_LIST_ITEM);
    extras.putInt(
        MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE,
        MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_GRID_ITEM);
    mediaDescriptionBuilder.setExtras(extras);
    return new MediaBrowser.MediaItem(
        mediaDescriptionBuilder.build(), MediaBrowser.MediaItem.FLAG_BROWSABLE);
}

موارد را با استفاده از نکات عنوان گروه بندی کنید

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

این قطعه کد نحوه ایجاد یک MediaItem با عنوان زیرگروه Songs را نشان می دهد:

کاتلین

import androidx.media.utils.MediaConstants

private fun createMediaItem(
    mediaId: String,
    folderName: String,
    iconUri: Uri
): MediaBrowser.MediaItem {
    val mediaDescriptionBuilder = MediaDescription.Builder()
    mediaDescriptionBuilder.setMediaId(mediaId)
    mediaDescriptionBuilder.setTitle(folderName)
    mediaDescriptionBuilder.setIconUri(iconUri)
    val extras = Bundle()
    extras.putString(
        MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE,
        "Songs")
    mediaDescriptionBuilder.setExtras(extras)
    return MediaBrowser.MediaItem(
        mediaDescriptionBuilder.build(), /* playable or browsable flag*/)
}

جاوا

import androidx.media.utils.MediaConstants;

private MediaBrowser.MediaItem createMediaItem(String mediaId, String folderName, Uri iconUri) {
   MediaDescription.Builder mediaDescriptionBuilder = new MediaDescription.Builder();
   mediaDescriptionBuilder.setMediaId(mediaId);
   mediaDescriptionBuilder.setTitle(folderName);
   mediaDescriptionBuilder.setIconUri(iconUri);
   Bundle extras = new Bundle();
   extras.putString(
       MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE,
       "Songs");
   mediaDescriptionBuilder.setExtras(extras);
   return new MediaBrowser.MediaItem(
       mediaDescriptionBuilder.build(), /* playable or browsable flag*/);
}

برنامه شما باید همه موارد رسانه‌ای را که می‌خواهید با هم به‌عنوان یک بلوک پیوسته گروه‌بندی کنید، ارسال کند. برای مثال، نمایش دو گروه از آیتم های رسانه ای، «آهنگ ها» و «آلبوم ها» را به ترتیب در نظر بگیرید. اگر برنامه شما پنج مورد رسانه را به این ترتیب ارسال کند، Android Auto و AAOS آنها را به عنوان چهار گروه جداگانه تفسیر می‌کنند:

  • مورد رسانه A با extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs")
  • مورد رسانه B با extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Albums")
  • مورد رسانه C با extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs")
  • مورد رسانه D با extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs")
  • مورد رسانه E با extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Albums")

در نتیجه این چهار گروه به وجود می آیند:

  • گروه 1، به نام "ترانه ها"، حاوی آیتم رسانه ای A
  • گروه 2، به نام "آلبوم"، حاوی آیتم رسانه ای B
  • گروه 3، به نام "ترانه ها"، حاوی آیتم های رسانه ای C و D
  • گروه 4، به نام "آلبوم"، حاوی آیتم رسانه ای E

برای نمایش این موارد در دو گروه، برنامه شما باید موارد رسانه را به ترتیب زیر ارسال کند:

  • مورد رسانه A با extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs")
  • مورد رسانه C با extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs")
  • مورد رسانه D با extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs")
  • مورد رسانه B با extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Albums")
  • مورد رسانه E با extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Albums")

نشانگرهای فراداده اضافی را نمایش دهید

می توانید شاخص های فراداده اضافی را برای ارائه اطلاعات در یک نگاه برای محتوا در درخت مرورگر رسانه و در حین پخش اضافه کنید.

در درخت مرور، Android Auto و AAOS موارد اضافی مرتبط با یک مورد را می خوانند و نشانگرها را نمایش می دهند. در حین پخش رسانه، Android Auto و AAOS فراداده‌های جلسه رسانه را می‌خوانند و به دنبال ثابت‌های خاصی می‌گردند تا مشخص کنند کدام شاخص‌ها را نمایش دهند.

نمایش پخش با ابرداده

شکل 3. نمای پخش با ابرداده.

برای محتوای پخش نشده، نمای را مرور کنید.

شکل 4. نمای محتوای پخش نشده را مرور کنید.

این ثابت ها را می توان هم در توضیحات اضافی MediaItem و هم در موارد اضافی MediaMetadata استفاده کرد:

  • EXTRA_DOWNLOAD_STATUS : وضعیت دانلود یک مورد را نشان می دهد. از این ثابت به عنوان کلید استفاده کنید. این ثابت های طولانی مقادیر ممکن هستند:

  • METADATA_KEY_IS_EXPLICIT : نشان می دهد که مورد حاوی محتوای صریح است. برای نشان دادن صریح بودن یک مورد، از این ثابت به عنوان کلید و METADATA_VALUE_ATTRIBUTE_PRESENT طولانی به عنوان مقدار استفاده کنید.

این ثابت ها را فقط می توان در توضیحات اضافی MediaItem استفاده کرد:

برای نمایش نشانگرهایی که در حالی که کاربر در حال مرور درخت مرور رسانه است ظاهر می شوند، یک بسته اضافی ایجاد کنید که شامل یک یا چند مورد از این ثابت ها باشد. سپس، آن بسته را به متد MediaDescription.Builder.setExtras منتقل کنید.

این قطعه نحوه نمایش نشانگرها را برای یک مورد رسانه صریح که 70٪ کامل است نشان می دهد:

کاتلین

import androidx.media.utils.MediaConstants

val extras = Bundle()
extras.putLong(
    MediaConstants.METADATA_KEY_IS_EXPLICIT,
    MediaConstants.METADATA_VALUE_ATTRIBUTE_PRESENT)
extras.putInt(
    MediaConstants.DESCRIPTION_EXTRAS_KEY_COMPLETION_STATUS,
    MediaConstants.DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_PARTIALLY_PLAYED)
extras.putDouble(
    MediaConstants.DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE, 0.7)
val description =
    MediaDescriptionCompat.Builder()
        .setMediaId(/*...*/)
        .setTitle(resources.getString(/*...*/))
        .setExtras(extras)
        .build()
return MediaBrowserCompat.MediaItem(description, /* flags */)

جاوا

import androidx.media.utils.MediaConstants;

Bundle extras = new Bundle();
extras.putLong(
    MediaConstants.METADATA_KEY_IS_EXPLICIT,
    MediaConstants.METADATA_VALUE_ATTRIBUTE_PRESENT);
extras.putInt(
    MediaConstants.DESCRIPTION_EXTRAS_KEY_COMPLETION_STATUS,
    MediaConstants.DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_PARTIALLY_PLAYED);
extras.putDouble(
    MediaConstants.DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE, 0.7);
MediaDescriptionCompat description =
    new MediaDescriptionCompat.Builder()
        .setMediaId(/*...*/)
        .setTitle(resources.getString(/*...*/))
        .setExtras(extras)
        .build();
return new MediaBrowserCompat.MediaItem(description, /* flags */);

برای نمایش نشانگرهای مورد رسانه ای که در حال پخش است، مقادیر METADATA_KEY_IS_EXPLICIT یا EXTRA_DOWNLOAD_STATUS را در mediaSession MediaMetadataCompat خود اعلام کنید.

این قطعه کد نحوه نشان دادن صریح بودن و بارگیری آهنگ در نمای پخش را نشان می دهد:

کاتلین

import androidx.media.utils.MediaConstants

mediaSession.setMetadata(
    MediaMetadataCompat.Builder()
        .putString(
            MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, "Song Name")
        .putString(
            MediaMetadataCompat.METADATA_KEY_DISPLAY_SUBTITLE, "Artist name")
        .putString(
            MediaMetadataCompat.METADATA_KEY_ALBUM_ART_URI,
            albumArtUri.toString())
        .putLong(
            MediaConstants.METADATA_KEY_IS_EXPLICIT,
            MediaConstants.METADATA_VALUE_ATTRIBUTE_PRESENT)
        .putLong(
            MediaDescriptionCompat.EXTRA_DOWNLOAD_STATUS,
            MediaDescriptionCompat.STATUS_DOWNLOADED)
        .build())

جاوا

import androidx.media.utils.MediaConstants;

mediaSession.setMetadata(
    new MediaMetadataCompat.Builder()
        .putString(
            MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, "Song Name")
        .putString(
            MediaMetadataCompat.METADATA_KEY_DISPLAY_SUBTITLE, "Artist name")
        .putString(
            MediaMetadataCompat.METADATA_KEY_ALBUM_ART_URI,
            albumArtUri.toString())
        .putLong(
            MediaConstants.METADATA_KEY_IS_EXPLICIT,
            MediaConstants.METADATA_VALUE_ATTRIBUTE_PRESENT)
        .putLong(
            MediaDescriptionCompat.EXTRA_DOWNLOAD_STATUS,
            MediaDescriptionCompat.STATUS_DOWNLOADED)
        .build());

هنگام پخش محتوا، نوار پیشرفت را در نمای مرور به‌روزرسانی کنید

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

برای اینکه Android Auto و AAOS نوار پیشرفت را به‌روز نگه دارند، اطلاعات بیشتری را در MediaMetadataCompat و PlaybackStateCompat ارائه کنید تا محتوای در حال انجام را به موارد رسانه در نمای مرور پیوند دهید.

برای اینکه یک آیتم رسانه نوار پیشرفت به‌روزرسانی خودکار داشته باشد، باید این شرایط رعایت شود:

این قطعه کد نشان می دهد که چگونه می توان نشان داد که آیتم در حال پخش به یک مورد در نمای مرور مرتبط است:

کاتلین

import androidx.media.utils.MediaConstants

// When the MediaItem is constructed to show in the browse view.
// Suppose the item was 25% complete when the user launched the browse view.
val mediaItemExtras = Bundle()
mediaItemExtras.putDouble(
    MediaConstants.DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE, 0.25)
val description =
    MediaDescriptionCompat.Builder()
        .setMediaId("my-media-id")
        .setExtras(mediaItemExtras)
        // ...and any other setters.
        .build()
return MediaBrowserCompat.MediaItem(description, /* flags */)

// Elsewhere, when the user has selected MediaItem for playback.
mediaSession.setMetadata(
    MediaMetadataCompat.Builder()
        .putString(MediaMetadata.METADATA_KEY_MEDIA_ID, "my-media-id")
        // ...and any other setters.
        .build())

val playbackStateExtras = Bundle()
playbackStateExtras.putString(
    MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_MEDIA_ID, "my-media-id")
mediaSession.setPlaybackState(
    PlaybackStateCompat.Builder()
        .setExtras(playbackStateExtras)
        // ...and any other setters.
        .build())

جاوا

import androidx.media.utils.MediaConstants;

// When the MediaItem is constructed to show in the browse view.
// Suppose the item was 25% complete when the user launched the browse view.
Bundle mediaItemExtras = new Bundle();
mediaItemExtras.putDouble(
    MediaConstants.DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE, 0.25);
MediaDescriptionCompat description =
    new MediaDescriptionCompat.Builder()
        .setMediaId("my-media-id")
        .setExtras(mediaItemExtras)
        // ...and any other setters.
        .build();
return new MediaBrowserCompat.MediaItem(description, /* flags */);

// Elsewhere, when the user has selected MediaItem for playback.
mediaSession.setMetadata(
    new MediaMetadataCompat.Builder()
        .putString(MediaMetadata.METADATA_KEY_MEDIA_ID, "my-media-id")
        // ...and any other setters.
        .build());

Bundle playbackStateExtras = new Bundle();
playbackStateExtras.putString(
    MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_MEDIA_ID, "my-media-id");
mediaSession.setPlaybackState(
    new PlaybackStateCompat.Builder()
        .setExtras(playbackStateExtras)
        // ...and any other setters.
        .build());

P حتی محتوای پخش نشده یا به طور کامل پخش شده می تواند نوار پیشرفت به روز رسانی خودکار را نمایش دهد. اگر موارد رسانه مربوطه شامل DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE اضافی با مقدار 0.0 (برای پخش نشده) یا 1.0 (برای پخش کامل) باشد. پس از اینکه کاربر این موارد رسانه ای را انتخاب کرد، Android Auto و AAOS نوار پیشرفت را بر روی سایر نشانگرهای پیشرفت نمایش می دهند.