Inhaltsstile anwenden

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

Listeneinträge

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

Rasterelemente

Abbildung 2 : Bei Rasterelementen haben Bilder Vorrang vor Titeln und Metadaten.

Standardinhaltsstile festlegen

Sie können globale Standardeinstellungen für die Anzeige Ihrer Media-Elemente festlegen. Fügen Sie dazu bestimmte Konstanten in das BrowserRoot Extras-Bundle ein, das von der Implementierung Ihres onGetRoot Dienstes zurückgegeben wird, und suchen Sie nach diesen Konstanten, um den entsprechenden Stil zu bestimmen.

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

Diese Schlüssel können den folgenden ganzzahligen Konstantenwerten zugeordnet werden, um die Präsentation dieser Elemente zu beeinflussen:

  • DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_LIST_ITEM: Entsprechende Elemente werden als Listenelemente präsentiert.

  • DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_GRID_ITEM: Entsprechende Elemente werden als Rasterelemente präsentiert.

  • DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_CATEGORY_LIST_ITEM: Entsprechende Elemente werden als Listenelemente der Kategorie präsentiert, ähnlich wie normale Listenelemente, aber um die Symbole der Elemente werden Ränder angewendet. Dadurch wird das Erscheinungsbild kleiner Symbole verbessert. Symbole müssen Vektorgrafiken sein, deren Farbe geändert werden kann. Dieser Hinweis sollte nur für durchsuchbare Elemente angegeben werden.

  • DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_CATEGORY_GRID_ITEM: Entsprechende Elemente werden als Rasterelemente der Kategorie präsentiert, ähnlich wie normale Rasterelemente, aber um die Symbole der Elemente werden Ränder angewendet. Dadurch wird das Erscheinungsbild kleiner Symbole verbessert. Die Symbole müssen Vektorgrafiken sein, deren Farbe geändert werden kann. Dieser Hinweis sollte nur für durchsuchbare Elemente angegeben werden.

Dieses Code-Snippet zeigt, wie Sie den Standardinhaltsstil 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 pro Element festlegen

Sie können den Standardinhaltsstil für alle Nachfolger eines durchsuchbaren Media-Elements sowie für alle Media-Elemente überschreiben. Wenn Sie den Standardstil für die Nachfolgerelemente eines blätterbaren Mediendatei-Elements überschreiben möchten, erstellen Sie ein Extras-Bundle in der MediaDescription des Mediendatei-Elements und fügen Sie die gleichen zuvor erwähnten Hinweise hinzu:

  • DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE gilt für die abspielbaren Nachfolger dieses Elements.

  • DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_BROWSABLE gilt für die durchsuchbaren Nachfolgerelemente dieses Elements.

Wenn Sie den Standardstil für ein bestimmtes Media-Element (nicht für seine Nachfolger) überschreiben möchten, erstellen Sie ein Extras-Bundle in der MediaDescription des Media-Elements. Fügen Sie dann einen Hinweis mit dem Schlüssel DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_SINGLE_ITEM hinzu. Verwenden Sie die gleichen Werte wie oben beschrieben, um die Präsentation dieses Elements anzugeben.

Dieses Code-Snippet zeigt, wie Sie ein durchsuchbares MediaItem erstellen, das den Standardinhaltsstil für sich selbst und seine Nachfolgerelemente überschreibt. Es wird als Listenelement der Kategorie, seine durchsuchbaren Nachfolgerelemente als Listenelemente und seine abspielbaren Nachfolgerelemente als Rasterelemente formatiert.

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 mit Titelhinweisen gruppieren

Wenn Sie ähnliche Media-Elemente gruppieren möchten, verwenden Sie einen Hinweis pro Element. Für jedes Media-Element in einer Gruppe muss in der 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 String Wert enthalten. Lokalisieren Sie diesen String, da er für den Titel der Gruppe verwendet wird.

Dieses Code-Snippet zeigt, wie Sie ein MediaItem mit der Untergruppentitel 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 „Albums“. Wenn Ihre App fünf Media-Elemente in dieser Reihenfolge übergibt, werden sie von Android Auto und AAOS als vier separate Gruppen interpretiert:

  • Media-Element A mit extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs")
  • Media-Element B mit extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Albums")
  • Media-Element C mit extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs")
  • Media-Element D mit extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs")
  • Media-Element E mit extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Albums")

Das führt zu diesen vier Gruppen:

  • Gruppe 1 mit dem Namen „Songs“ und dem Media-Element A
  • Gruppe 2 mit dem Namen „Albums“ und dem Media-Element B
  • Gruppe 3 mit dem Namen „Songs“ und den Media-Elementen C und D
  • Gruppe 4 mit dem Namen „Albums“ und dem Media-Element E

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

  • Media-Element A mit extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs")
  • Media-Element C mit extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs")
  • Media-Element D mit extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs")
  • Media-Element B mit extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Albums")
  • Media-Element 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 Suchstruktur des Media-Browsers und während der Wiedergabe zu erhalten.

In der Suchstruktur lesen Android Auto und AAOS die mit einem Element verknüpften Extras und zeigen die Indikatoren an. Während der Medienwiedergabe lesen Android Auto und AAOS die Metadaten für die Mediensitzung und suchen nach bestimmten Konstanten, um zu bestimmen, welche Indikatoren angezeigt werden sollen.

Wiedergabeansicht mit Metadaten

Abbildung 3 : Wiedergabeansicht mit Metadaten.

Übersicht für nicht abgespielte Inhalte.

Abbildung 4 : Suchansicht für nicht wiedergegebene Inhalte.

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

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

Wenn Sie Indikatoren anzeigen möchten, die eingeblendet werden, während der Nutzer in der Suchstruktur des Media-Browsers sucht, erstellen Sie ein Extras-Bundle, das eine oder mehrere dieser Konstanten enthält. Übergeben Sie dieses Bundle dann an die Methode MediaDescription.Builder.setExtras.

Dieses Code-Snippet zeigt, 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 in der MediaMetadataCompat Ihrer mediaSession.

Dieses Code-Snippet zeigt, wie Sie angeben, 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());

Fortschrittsleiste in der Suchansicht während der Wiedergabe von Inhalten aktualisieren

Wie bereits erwähnt, können Sie das DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE Extra verwenden, um in der Suchansicht eine Fortschritt sleiste für teilweise wiedergegebene Inhalte anzuzeigen. Wenn ein Nutzer die teilweise wiedergegebenen Inhalte jedoch weiter abspielt, wird dieser Indikator mit der Zeit ungenau.

Damit Android Auto und AAOS die Fortschrittsleiste auf dem neuesten Stand halten, geben Sie in MediaMetadataCompat und PlaybackStateCompat zusätzliche Informationen an, um laufende Inhalte mit Media-Elementen in der Suchansicht zu verknüpfen.

Damit für ein Media-Element eine automatisch aktualisierte Fortschrittsleiste angezeigt 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 Suchansicht 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 für nicht wiedergegebene oder vollständig wiedergegebene Inhalte kann eine automatisch aktualisierte Fortschrittsleiste angezeigt werden. Das ist der Fall, wenn die entsprechenden Media-Elemente das Extra DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE mit dem Wert 0.0 (für nicht wiedergegeben) oder 1.0 (für vollständig wiedergegeben) enthalten. Nachdem der Nutzer diese Media-Elemente ausgewählt hat, zeigen Android Auto und AAOS die Fortschrittsleiste über anderen Fortschrittsindikatoren an.