Zastosuj style treści

Po użyciu elementów, które można przeglądać lub odtwarzać, do utworzenia hierarchii treści zastosuj style treści, aby określić, jak te elementy będą wyświetlane w samochodzie. Użyj tych stylów treści:

Elementy listy

Rysunek 1. W przypadku elementów listy tytuły i metadane mają wyższy priorytet niż obrazy.

Elementy siatki

Rysunek 2. Elementy siatki traktują obrazy priorytetowo w stosunku do tytułów i metadanych.

Ustawianie domyślnych stylów treści

Możesz ustawić globalne wartości domyślne określające sposób wyświetlania komponentów. Aby to zrobić, uwzględnij konkretne stałe w pakiecie BrowserRootextras zwracanym przez implementację onGetRoot usługi i wyszukaj te stałe, aby określić odpowiedni styl.

Jako klucze w pakiecie można używać tych dodatków:

Te klucze mogą być mapowane na te stałe wartości całkowite, aby wpływać na prezentację tych elementów:

  • DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_LIST_ITEM: odpowiednie elementy przedstawione jako pozycje listy.

  • DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_GRID_ITEM: odpowiednie produkty wyświetlane jako elementy siatki.

  • DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_CATEGORY_LIST_ITEM: Odpowiednie elementy prezentowane jako elementy listy „kategoria”, podobne do zwykłych elementów listy, ale z marginesami wokół ikon elementów. Poprawia to wygląd małych ikon. Ikony muszą być rysunkami wektorowymi z możliwością zmiany koloru. Ta wskazówka powinna być podawana tylko w przypadku produktów, które można przeglądać.

  • DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_CATEGORY_GRID_ITEM: Odpowiednie produkty są prezentowane jako elementy siatki „kategoria” i są podobne do zwykłych elementów siatki, ale wokół ikon produktów są stosowane marginesy. Poprawia to wygląd małych ikon. Ikony muszą być rysunkami wektorowymi, które można kolorować. Ta wskazówka powinna być podawana tylko w przypadku elementów, które można przeglądać.

Ten fragment kodu pokazuje, jak ustawić domyślny styl treści dla elementów, które można przeglądać, na siatki, a dla elementów, które można odtwarzać, na listy:

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

Ustawianie stylów treści dla poszczególnych elementów

Możesz zastąpić domyślny styl treści dla elementów podrzędnych dowolnego elementu multimedialnego, który można przeglądać, a także dla dowolnego elementu multimedialnego. Aby zastąpić domyślne ustawienia dla elementów podrzędnych elementu multimedialnego, który można przeglądać, utwórz pakiet dodatków w MediaDescription elementu multimedialnego i dodaj te same wskazówki, o których wspomnieliśmy wcześniej:

  • DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE dotyczy elementów podrzędnych, które można odtworzyć.

  • DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_BROWSABLE ma zastosowanie do elementów podrzędnych, które można przeglądać.

Aby zastąpić wartość domyślną w przypadku konkretnego elementu multimedialnego (nie jego elementów podrzędnych), utwórz pakiet dodatków w MediaDescription elementu multimedialnego. Następnie dodaj podpowiedź z kluczem DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_SINGLE_ITEM. Aby określić prezentację produktu, użyj tych samych wartości, które zostały opisane wcześniej.

Ten fragment kodu pokazuje, jak utworzyć element MediaItem, który zastępuje domyślny styl treści dla siebie i swoich elementów podrzędnych. Jest stylizowany jako element listy kategorii, jego potomkowie, których można przeglądać, jako elementy listy, a potomkowie, których można odtwarzać, jako elementy siatki.

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

Grupowanie elementów za pomocą wskazówek dotyczących tytułu

Aby pogrupować powiązane elementy multimedialne, użyj wskazówki dotyczącej poszczególnych elementów. Każdy element multimedialny w grupie musi deklarować pakiet dodatków w swoim polu MediaDescription. Ten pakiet musi zawierać mapowanie z kluczem DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE i identyczną wartością ciągu znaków. Przetłumacz ten ciąg znaków, ponieważ jest on używany jako tytuł grupy.

Ten fragment kodu pokazuje, jak utworzyć MediaItem z nagłówkiem podgrupy Songs:

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

Aplikacja musi przekazywać wszystkie elementy multimedialne, które chcesz zgrupować, jako ciągły blok. Na przykład rozważ wyświetlanie w tej kolejności 2 grup elementów multimedialnych: „Utwory” i „Albumy”. Jeśli aplikacja przekaże 5 elementów multimedialnych w tej kolejności, Android Auto i AAOS zinterpretują je jako 4 osobne grupy:

  • Element multimedialny A z extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs")
  • Element multimedialny B z extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Albums")
  • Element multimedialny C z extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs")
  • Element multimedialny D z extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs")
  • Element multimedialny E z extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Albums")

W rezultacie otrzymasz te 4 grupy:

  • Grupa 1 o nazwie „Utwory” zawierająca element multimedialny A
  • Grupa 2 o nazwie „Albumy” zawierająca element multimedialny B
  • Grupa 3 o nazwie „Utwory” zawierająca elementy multimedialne C i D
  • Grupa 4 o nazwie „Albumy” zawierająca element multimedialny E

Aby wyświetlić te elementy w 2 grupach, aplikacja musi przekazywać elementy multimedialne w tej kolejności:

  • Element multimedialny A z extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs")
  • Element multimedialny C z extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs")
  • Element multimedialny D z extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs")
  • Element multimedialny B z extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Albums")
  • Element multimedialny E z extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Albums")

Wyświetlanie dodatkowych wskaźników metadanych

Możesz dodać dodatkowe wskaźniki metadanych, aby zapewnić szybki dostęp do informacji o treści w drzewie przeglądarki multimediów i podczas odtwarzania.

W drzewie przeglądania Android Auto i AAOS odczytują dodatkowe informacje powiązane z elementem i wyświetlają wskaźniki. Podczas odtwarzania multimediów Android Auto i AAOS odczytują metadane sesji multimedialnej i wyszukują określone stałe, aby określić, które wskaźniki mają być wyświetlane.

Widok odtwarzania z metadanymi

Rysunek 3. Widok odtwarzania z metadanymi.

Widok przeglądania nieodtwarzanych treści.

Rysunek 4. Widok przeglądania nieodtwarzanych treści.

Te stałe wartości mogą być używane zarównoMediaItemdodatkach do opisu, jak i w MediaMetadatadodatkach:

Te stałe wartości mogą być używane tylko w rozszerzeniach z MediaItem:

Aby wyświetlać wskaźniki, które pojawiają się podczas przeglądania drzewa multimediów, utwórz pakiet dodatków zawierający co najmniej jedną z tych stałych. Następnie przekaż ten pakiet do metody MediaDescription.Builder.setExtras.

Ten fragment kodu pokazuje, jak wyświetlać wskaźniki dla elementu multimedialnego o treściach dla dorosłych, który jest ukończony w 70%:

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

Aby wyświetlić wskaźniki dla aktualnie odtwarzanego elementu multimedialnego, zadeklaruj wartości dla METADATA_KEY_IS_EXPLICIT lub EXTRA_DOWNLOAD_STATUSMediaMetadataCompat mediaSession.

Ten fragment kodu pokazuje, jak wskazać, że utwór w widoku odtwarzania jest przeznaczony dla osób pełnoletnich i pobrany:

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

Aktualizowanie paska postępu w widoku przeglądania podczas odtwarzania treści

Jak już wspomnieliśmy, możesz użyć dodatku DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE, aby wyświetlać pasek postępu dla częściowo odtworzonych treści w widoku przeglądania. Jeśli jednak użytkownik będzie nadal odtwarzać częściowo odtworzone treści, wskaźnik ten z czasem stanie się niedokładny.

Aby pasek postępu w Androidzie Auto i AAOS był zawsze aktualny, podaj dodatkowe informacje w MediaMetadataCompatPlaybackStateCompat, aby połączyć bieżące treści z elementami multimedialnymi w widoku przeglądania.

Aby element multimedialny miał automatycznie aktualizowany pasek postępu, muszą być spełnione te wymagania:

Ten fragment kodu pokazuje, jak wskazać, że odtwarzany element jest połączony z elementem w widoku przeglądania:

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

P Nawet w przypadku nieodtwarzanych lub w pełni odtworzonych treści może się wyświetlać automatycznie aktualizowany pasek postępu. Dzieje się tak, jeśli odpowiednie elementy multimedialne zawierają dodatkowy parametr DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE o wartości 0.0 (w przypadku nieodtwarzanych) lub 1.0 (w przypadku w pełni odtworzonych). Gdy użytkownik wybierze te multimedia, Android Auto i AAOS wyświetlą pasek postępu nad innymi wskaźnikami postępu.