Inhaltsstile anwenden

Nachdem Sie mit durchsuchbaren oder abspielbaren Elementen Ihre Inhaltshierarchie erstellt haben, können Sie Inhaltsstile anwenden, um festzulegen, wie diese Elemente im Auto angezeigt werden. Verwenden Sie diese Inhaltsstile:

Listenelemente

Abbildung 1: Bei Listenelementen haben Titel und Metadaten Vorrang vor Bildern.

Rasterelemente

Abbildung 2: Bei Rasterelementen werden Bilder vor Titeln und Metadaten priorisiert.

Standardstile für Inhalte festlegen

Sie können globale Standardeinstellungen für die Darstellung Ihrer Media-Elemente festlegen. Dazu müssen Sie bestimmte Konstanten in das BrowserRoot-Extras-Bundle aufnehmen, das von der onGetRoot-Implementierung Ihres Dienstes zurückgegeben wird, und nach diesen Konstanten suchen, um den entsprechenden Stil zu ermitteln.

Diese Extras können als Schlüssel im Bundle verwendet werden:

Diese Schlüssel können den folgenden ganzzahligen Konstantenwerten zugeordnet werden, um die Darstellung der Elemente zu beeinflussen:

  • DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_LIST_ITEM: Entsprechende Elemente, die als Listenelemente dargestellt werden.

  • DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_GRID_ITEM: Entsprechende Elemente, die als Rasterelemente dargestellt werden.

  • DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_CATEGORY_LIST_ITEM: Entsprechende Elemente werden als Listenelemente vom Typ „category“ dargestellt, ähnlich wie normale Listenelemente. Allerdings werden Ränder um die Symbole der Elemente angewendet. Dadurch wird die Darstellung kleiner Symbole verbessert. Symbole müssen tintenfähige Vektordrawables sein. Dieser Hinweis sollte nur für durchsuchbare Elemente angegeben werden.

  • DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_CATEGORY_GRID_ITEM: Entsprechende Elemente werden als „Kategorie“-Grid-Elemente dargestellt. Sie ähneln normalen Grid-Elementen, aber um die Symbole der Elemente werden Ränder angewendet. Dadurch wird die Darstellung kleiner Symbole verbessert. Die Symbole müssen als Vektordrawables vorliegen, die eingefärbt werden können. Dieser Hinweis sollte nur für durchsuchbare Elemente angezeigt werden.

In diesem Code-Snippet wird gezeigt, wie Sie das Standardinhaltsformat für durchsuchbare Elemente auf Raster und für abspielbare Elemente auf Listen festlegen:

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

Inhaltsstile für einzelne Elemente festlegen

Sie können den Standardinhaltsstil für alle untergeordneten Elemente eines durchsuchbaren Media-Elements sowie für alle Media-Elemente überschreiben. Wenn Sie die Standardeinstellung für die untergeordneten Elemente eines durchsuchbaren Media-Elements überschreiben möchten, erstellen Sie ein Extras-Bundle im MediaDescription des Media-Elements und fügen Sie die oben genannten Hinweise hinzu:

  • DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE gilt für die abspielbaren untergeordneten Elemente dieses Artikels.

  • DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_BROWSABLE gilt für die durchsuchbaren untergeordneten Elemente dieses Artikels.

Wenn Sie den Standardwert für ein bestimmtes Media-Element (nicht für seine untergeordneten Elemente) überschreiben möchten, erstellen Sie im MediaDescription des Media-Elements ein Extras-Bundle. Fügen Sie dann einen Hinweis mit dem Schlüssel DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_SINGLE_ITEM hinzu. Verwenden Sie die zuvor beschriebenen Werte, um die Darstellung des Elements festzulegen.

In diesem Code-Snippet wird gezeigt, wie Sie ein durchsuchbares MediaItem erstellen, das den Standardinhaltsstil für sich selbst und seine untergeordneten Elemente überschreibt. Es wird als Kategorielistenelement formatiert, seine durchsuchbaren untergeordneten Elemente als Listenelemente und seine abspielbaren untergeordneten Elemente als Rasterelemente.

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

Elemente anhand von Titelhinweisen gruppieren

Verwenden Sie einen Hinweis pro Element, um ähnliche Media-Elemente zu gruppieren. Für jedes Media-Element in einer Gruppe muss im MediaDescription ein Extras-Bundle deklariert werden. Dieses Bundle muss eine Zuordnung mit dem Schlüssel DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE und einem identischen Stringwert enthalten. Lokalisieren Sie diesen String, da er für den Titel der Gruppe verwendet wird.

Dieses Code-Snippet zeigt, wie Sie ein MediaItem-Objekt mit der Untergruppenüberschrift Songs erstellen:

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

Ihre App muss alle Media-Elemente, die Sie gruppieren möchten, als zusammenhängenden Block übergeben. Angenommen, Sie möchten zwei Gruppen von Media-Elementen in dieser Reihenfolge anzeigen: „Songs“ und „Alben“. Wenn Ihre App fünf Media-Elemente in dieser Reihenfolge übergibt, interpretieren Android Auto und AAOS sie als vier separate Gruppen:

  • Medienelement A mit extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs")
  • Medienelement B mit extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Albums")
  • Medienelement C mit extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs")
  • Mediendatei D mit extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs")
  • Medienelement E mit extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Albums")

Daraus ergeben sich die folgenden vier Gruppen:

  • Gruppe 1 mit dem Namen „Songs“ und dem Media-Element A
  • Gruppe 2 mit dem Namen „Alben“, die das Media-Element B enthält
  • Gruppe 3 mit dem Namen „Songs“ mit den Media-Elementen C und D
  • Gruppe 4 mit dem Namen „Alben“, die das Media-Element E enthält

Wenn Sie diese Elemente in zwei Gruppen anzeigen möchten, muss Ihre App die Media-Elemente stattdessen in dieser Reihenfolge übergeben:

  • Medienelement A mit extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs")
  • Medienelement C mit extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs")
  • Mediendatei D mit extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs")
  • Medienelement B mit extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Albums")
  • Medienelement E mit extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Albums")

Zusätzliche Metadatenindikatoren anzeigen

Sie können zusätzliche Metadatenindikatoren einfügen, um auf einen Blick Informationen zu Inhalten in der Media-Browser-Baumstruktur und während der Wiedergabe zu erhalten.

Im Browserbaum werden für Android Auto und AAOS die Extras gelesen, die einem Element zugeordnet sind, und die Indikatoren werden angezeigt. Während der Medienwiedergabe lesen Android Auto und AAOS die Metadaten für die Mediensitzung und suchen nach bestimmten Konstanten, um zu ermitteln, welche Anzeigen angezeigt werden sollen.

Wiedergabeansicht mit Metadaten

Abbildung 3: Wiedergabeansicht mit Metadaten.

Übersicht für nicht wiedergegebene Inhalte.

Abbildung 4: Übersicht für nicht wiedergegebene Inhalte.

Diese Konstanten können sowohl in MediaItem-Beschreibungsextras als auch in MediaMetadata-Extras verwendet werden:

Diese Konstanten können nur in MediaItem-Beschreibungsextras verwendet werden:

Wenn Sie Indikatoren anzeigen möchten, die während des Browsens des Media-Browsing-Baums durch den Nutzer erscheinen, erstellen Sie ein Extras-Bundle, das eine oder mehrere dieser Konstanten enthält. Übergeben Sie dieses Bundle dann an die MediaDescription.Builder.setExtras-Methode.

In diesem Snippet wird gezeigt, wie Sie Indikatoren für ein explizites Media-Element anzeigen, das zu 70% abgeschlossen ist:

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

Wenn Sie Indikatoren für ein Media-Element anzeigen möchten, das gerade wiedergegeben wird, deklarieren Sie Werte für METADATA_KEY_IS_EXPLICIT oder EXTRA_DOWNLOAD_STATUS im MediaMetadataCompat Ihres mediaSession.

In diesem Code-Snippet wird gezeigt, wie angegeben wird, dass der Song in der Wiedergabeansicht explizit ist und heruntergeladen wurde:

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

Fortschrittsanzeige in der Ansicht „Entdecken“ während der Wiedergabe von Inhalten aktualisieren

Wie bereits erwähnt, können Sie mit dem Extra DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE einen Fortschrittsbalken für teilweise wiedergegebene Inhalte in der Ansicht „Durchsuchen“ anzeigen. Wenn ein Nutzer jedoch die teilweise wiedergegebenen Inhalte weiter abspielt, wird die Anzeige mit der Zeit ungenau.

Damit die Fortschrittsanzeige in Android Auto und AAOS auf dem neuesten Stand bleibt, müssen Sie in MediaMetadataCompat und PlaybackStateCompat zusätzliche Informationen angeben, um laufende Inhalte mit Media-Elementen in der Ansicht „Durchsuchen“ zu verknüpfen.

Damit für ein Media-Element automatisch eine Fortschrittsanzeige aktualisiert wird, müssen die folgenden Anforderungen erfüllt sein:

Dieses Code-Snippet zeigt, wie Sie angeben, dass das wiedergegebene Element mit einem Element in der Ansicht „Durchsuchen“ verknüpft ist:

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 Auch bei nicht abgespielten oder vollständig abgespielten Inhalten kann eine automatisch aktualisierte Fortschrittsanzeige angezeigt werden. Dies tritt auf, wenn die entsprechenden Media-Elemente das Extra DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE mit dem Wert 0.0 (für nicht abgespielte) oder 1.0 (für vollständig abgespielte) enthalten. Nachdem der Nutzer diese Media-Elemente ausgewählt hat, wird der Fortschrittsbalken in Android Auto und AAOS über anderen Fortschrittsanzeigen eingeblendet.