İçerik stillerini uygula

Göz atılabilir veya oynatılabilir öğeleri kullanarak içerik hiyerarşinizi oluşturduktan sonra, bu öğelerin arabada nasıl görüntüleneceğini belirlemek için içerik stilleri uygulayın. Aşağıdaki içerik stillerini kullanın:

Liste öğeleri

Şekil 1. Liste öğelerinde başlıklar ve meta veriler, resimlere göre önceliklidir.

Tablo öğeleri

Şekil 2. Izgara öğelerinde, başlıklara ve meta verilere kıyasla görsellere öncelik verilir.

Varsayılan içerik stillerini ayarlama

Medya öğelerinizin nasıl görüntüleneceğine dair genel varsayılanlar ayarlayabilirsiniz. Bunu yapmak için hizmetinizin onGetRoot uygulamasının döndürdüğü BrowserRoot ekstralar paketine belirli sabitleri ekleyin ve uygun stili belirlemek için bu sabitleri arayın.

Pakette anahtar olarak kullanılabilecek ekstralar:

Bu anahtarlar, öğelerin sunumunu etkilemek için aşağıdaki tam sayı sabit değerleriyle eşlenebilir:

Bu kod snippet'inde, göz atılabilir öğeler için varsayılan içerik stilinin ızgara, oynatılabilir öğeler için ise liste olarak nasıl ayarlanacağı gösterilmektedir:

Kotlin

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)
}

Java

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);
}

Öğe başına içerik stilleri ayarlama

Göz atılabilir medya öğelerinin alt öğeleri ve tüm medya öğeleri için varsayılan içerik stilini geçersiz kılabilirsiniz. Göz atılabilir bir medya öğesinin alt öğeleri için varsayılanı geçersiz kılmak üzere medya öğesinin MediaDescription bölümünde bir ekler paketi oluşturun ve daha önce bahsedilen ipuçlarını ekleyin:

  • DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE, öğenin oynatılabilir alt öğeleri için geçerlidir.

  • DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_BROWSABLE, öğenin göz atılabilir alt öğeleri için geçerlidir.

Belirli bir medya öğesi (alt öğeleri değil) için varsayılanı geçersiz kılmak istiyorsanız medya öğesinin MediaDescription bölümünde bir ekler paketi oluşturun. Ardından, DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_SINGLE_ITEM tuşuyla bir ipucu ekleyin. Öğenin sunumunu belirtmek için daha önce açıklanan değerleri kullanın.

Bu kod snippet'inde, kendisi ve alt öğeleri için varsayılan içerik stilini geçersiz kılan, göz atılabilir bir MediaItem öğesinin nasıl oluşturulacağı gösterilmektedir. Kendisini kategori listesi öğesi, göz atılabilir alt öğelerini liste öğeleri ve oynatılabilir alt öğelerini de ızgara öğeleri olarak biçimlendirir.

Kotlin

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)
}

Java

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);
}

Başlık ipuçlarını kullanarak öğeleri gruplandırma

İlgili medya öğelerini gruplandırmak için öğe başına ipucu kullanın. Bir gruptaki her medya öğesi, MediaDescription içinde bir ekler paketi bildirmelidir. Bu pakette, DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE anahtarıyla eşleme ve aynı dize değeri bulunmalıdır. Bu dize, grubun başlığı için kullanıldığından yerelleştirilmelidir.

Bu kod snippet'inde, Songs alt grup başlığına sahip bir MediaItem öğesinin nasıl oluşturulacağı gösterilmektedir:

Kotlin

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*/)
}

Java

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*/);
}

Uygulamanız, birlikte gruplandırmak istediğiniz tüm medya öğelerini bitişik bir blok olarak iletmelidir. Örneğin, medya öğelerini "Şarkılar" ve "Albümler" olmak üzere iki grupta ve bu sırayla göstermeyi düşünün. Uygulamanız bu sırayla beş medya öğesi gönderirse Android Auto ve AAOS bunları dört ayrı grup olarak yorumlar:

  • extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs") içeren A medya öğesi
  • extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Albums") içeren B medya öğesi
  • extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs") içeren C medya öğesi
  • extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs") ile medya öğesi D
  • extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Albums") ile medya öğesi E

Bu durumda şu dört grup oluşur:

  • Medya öğesi A'yı içeren "Şarkılar" adlı 1. grup
  • "Albümler" adlı ve B medya öğesini içeren 2. grup
  • C ve D medya öğelerini içeren "Şarkılar" adlı 3. grup
  • "Albümler" adlı ve medya öğesi E'yi içeren 4. grup

Bu öğeleri iki grupta göstermek için uygulamanız medya öğelerini şu sırayla iletmelidir:

  • extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs") içeren A medya öğesi
  • extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs") içeren C medya öğesi
  • extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs") ile medya öğesi D
  • extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Albums") içeren B medya öğesi
  • extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Albums") ile medya öğesi E

Ek meta veri göstergelerini görüntüleme

Medya tarayıcı ağacındaki ve oynatma sırasındaki içeriklerle ilgili bilgileri bir bakışta sunmak için ek meta veri göstergeleri ekleyebilirsiniz.

Göz atma ağacında Android Auto ve AAOS, bir öğeyle ilişkili ekstraları okur ve göstergeleri görüntüler. Android Auto ve AAOS, medya oynatma sırasında medya oturumunun meta verilerini okur ve hangi göstergelerin görüntüleneceğini belirlemek için belirli sabitleri arar.

Meta verilerle oynatma görünümü

Şekil 3. Meta verilerle oynatma görünümü.

Oynatılmamış içerikler için göz atma görünümü.

Şekil 4. Oynatılmamış içerikler için göz atma görünümü.

Bu sabitler hem MediaItem açıklama ekstralarında hem de MediaMetadata ekstralarında kullanılabilir:

Bu sabitler yalnızca MediaItem açıklama metni ek açıklamalarında kullanılabilir:

Kullanıcı medya göz atma ağacına göz atarken görünen göstergeleri görüntülemek için bu sabitlerden birini veya daha fazlasını içeren bir ekler paketi oluşturun. Ardından bu paketi MediaDescription.Builder.setExtras yöntemine iletin.

Bu snippet'te, %70'i tamamlanmış bir uygunsuz içerik öğesi için göstergelerin nasıl görüntüleneceği gösterilmektedir:

Kotlin

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 */)

Java

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 */);

Şu anda oynatılan bir medya öğesi için göstergeleri görüntülemek üzere mediaSession öğenizin MediaMetadataCompat bölümünde METADATA_KEY_IS_EXPLICIT veya EXTRA_DOWNLOAD_STATUS için değerler bildirin.

Bu kod snippet'inde, oynatma görünümündeki şarkının uygunsuz içerikli ve indirilmiş olduğunu belirtme yöntemi gösterilmektedir:

Kotlin

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())

Java

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());

İçerik oynatılırken göz atma görünümündeki ilerleme çubuğunu güncelleme

Göz atma görünümünde kısmen oynatılan içeriklerin ilerleme çubuğunu göstermek için DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE ekstrasını kullanabilirsiniz. Ancak kullanıcı, kısmen oynatılan içeriği oynatmaya devam ederse bu gösterge zamanla yanlış hale gelir.

Android Auto ve AAOS'un ilerleme çubuğunu güncel tutması için MediaMetadataCompat ve PlaybackStateCompat içinde ek bilgiler sağlayarak devam eden içerikleri göz atma görünümündeki medya öğelerine bağlayın.

Bir medya öğesinin otomatik olarak güncellenen ilerleme çubuğuna sahip olması için şu şartların karşılanması gerekir:

Bu kod snippet'inde, oynatılan öğenin göz atma görünümündeki bir öğeye nasıl bağlandığı gösterilmektedir:

Kotlin

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())

Java

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());

Oynatılmamış veya tamamen oynatılmış içeriklerde bile otomatik olarak güncellenen bir ilerleme çubuğu gösterilebilir. Bu durum, ilgili medya öğeleri DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE ekstrasını 0.0 (oynatılmamış) veya 1.0 (tamamen oynatılmış) değeriyle içeriyorsa ortaya çıkar. Kullanıcı bu medya öğelerini seçtikten sonra Android Auto ve AAOS, ilerleme çubuğunu diğer ilerleme göstergelerinin üzerinde gösterir.