Dopo aver utilizzato gli elementi sfogliabili o riproducibili per creare la gerarchia dei contenuti, applica gli stili dei contenuti per determinare la modalità di visualizzazione di questi elementi in auto. Utilizza questi stili di contenuti:
Figura 1. Gli elementi dell'elenco danno la priorità a titoli e metadati rispetto alle immagini.
Figura 2. Gli elementi della griglia danno la priorità alle immagini rispetto a titoli e metadati.
Impostare gli stili di contenuti predefiniti
Puoi impostare valori predefiniti globali per la visualizzazione degli elementi multimediali. Per farlo,
includi costanti specifiche nel pacchetto di extra BrowserRoot restituito dall'implementazione onGetRoot del tuo
servizio e cerca queste costanti
per determinare lo stile appropriato.
Questi extra possono essere utilizzati come chiavi nel pacchetto:
DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_BROWSABLE: un suggerimento di presentazione per tutti gli elementi sfogliabili all'interno dell'albero di navigazione.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE: un suggerimento di presentazione per tutti gli elementi riproducibili all'interno dell'albero di navigazione.
Queste chiavi possono essere mappate a questi valori costanti interi per influenzare la presentazione di questi elementi:
DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_LIST_ITEM: gli elementi corrispondenti vengono presentati come elementi dell'elenco.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_GRID_ITEM: gli elementi corrispondenti vengono presentati come elementi della griglia.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_CATEGORY_LIST_ITEM: gli elementi corrispondenti vengono presentati come elementi dell'elenco "categoria", simili agli elementi dell'elenco normali, ma i margini vengono applicati alle icone degli elementi. In questo modo l'aspetto delle icone piccole migliora. Le icone devono essere disegni vettoriali colorabili. Fornisci questo suggerimento solo per gli elementi sfogliabili.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_CATEGORY_GRID_ITEM: gli elementi corrispondenti vengono presentati come elementi della griglia "categoria" e sono simili agli elementi della griglia normali, ma i margini vengono applicati alle icone degli elementi. In questo modo l'aspetto delle icone piccole migliora. Le icone devono essere disegni vettoriali colorabili. Fornisci questo suggerimento solo per gli elementi sfogliabili.
Questo snippet di codice mostra come impostare lo stile di contenuti predefinito per gli elementi sfogliabili sulle griglie e per gli elementi riproducibili sugli elenchi:
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);
}
Impostare gli stili di contenuti per elemento
Puoi sostituire lo stile di contenuti predefinito per i discendenti di qualsiasi elemento multimediale sfogliabile, nonché per qualsiasi elemento multimediale. Per sostituire il valore predefinito per i discendenti di un elemento multimediale sfogliabile, crea un pacchetto di extra in MediaDescription dell'elemento multimediale e aggiungi gli stessi suggerimenti menzionati in precedenza:
DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLEsi applica ai discendenti riproducibili dell'elemento.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_BROWSABLEsi applica ai discendenti sfogliabili dell'elemento.
Per sostituire il valore predefinito per un elemento multimediale specifico (non per i relativi discendenti), crea un pacchetto di extra in MediaDescription dell'elemento multimediale. Poi, aggiungi un suggerimento
con la chiave DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_SINGLE_ITEM. Utilizza gli stessi valori descritti in precedenza per specificare la presentazione dell'elemento.
Questo snippet di codice mostra come creare un MediaItem sfogliabile che sostituisce lo stile di contenuti predefinito per se stesso e i relativi discendenti. Lo stile è impostato come elemento dell'elenco delle categorie, i relativi discendenti sfogliabili come elementi dell'elenco e i relativi discendenti riproducibili come elementi della griglia.
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);
}
Raggruppare gli elementi utilizzando i suggerimenti per i titoli
Per raggruppare gli elementi multimediali correlati, utilizza un suggerimento per elemento. Ogni elemento multimediale di un gruppo deve dichiarare un pacchetto di extra in MediaDescription. Questo pacchetto deve
includere una mappatura con la chiave
DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE e un valore stringa
identico. Localizza questa stringa, perché viene utilizzata per il titolo del gruppo.
Questo snippet di codice mostra come creare un MediaItem con un'intestazione del sottogruppo 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*/);
}
La tua app deve passare tutti gli elementi multimediali che vuoi raggruppare come blocco contiguo. Ad esempio, prendi in considerazione la visualizzazione di due gruppi di elementi multimediali, "Songs" e "Albums", in questo ordine. Se la tua app passa cinque elementi multimediali in questo ordine, Android Auto e AAOS li interpretano come quattro gruppi separati:
- Elemento multimediale A con
extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs") - Elemento multimediale B con
extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Albums") - Elemento multimediale C con
extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs") - Elemento multimediale D con
extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs") - Elemento multimediale E con
extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Albums")
Il risultato sono questi quattro gruppi:
- Gruppo 1, denominato "Songs", contenente l'elemento multimediale A
- Gruppo 2, denominato "Albums", contenente l'elemento multimediale B
- Gruppo 3, denominato "Songs", contenente gli elementi multimediali C e D
- Gruppo 4, denominato "Albums", contenente l'elemento multimediale E
Per visualizzare questi elementi in due gruppi, la tua app deve invece passare gli elementi multimediali in questo ordine:
- Elemento multimediale A con
extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs") - Elemento multimediale C con
extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs") - Elemento multimediale D con
extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs") - Elemento multimediale B con
extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Albums") - Elemento multimediale E con
extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Albums")
Visualizzare indicatori di metadati aggiuntivi
Puoi includere indicatori di metadati aggiuntivi per fornire informazioni rapide sui contenuti nell'albero del browser multimediale e durante la riproduzione.
Nell'albero di navigazione, Android Auto e AAOS leggono gli extra associati a un elemento e visualizzano gli indicatori. Durante la riproduzione dei contenuti multimediali, Android Auto e AAOS leggono i metadati della sessione multimediale e cercano costanti specifiche per determinare quali indicatori visualizzare.
Figura 3. Visualizzazione della riproduzione con i metadati.
Figura 4. Visualizzazione di navigazione per i contenuti non riprodotti.
Queste costanti possono essere utilizzate sia negli extra della descrizione di MediaItem sia negli extra di MediaMetadata:
EXTRA_DOWNLOAD_STATUS: indica lo stato di download di un elemento. Utilizza questa costante come chiave. Queste costanti lunghe sono valori possibili:STATUS_DOWNLOADED: l'elemento è stato scaricato completamente.STATUS_DOWNLOADING: è in corso il download dell'elemento.STATUS_NOT_DOWNLOADED: l'elemento non è stato scaricato.
METADATA_KEY_IS_EXPLICIT: indica che l'elemento contiene contenuti espliciti. Per indicare che un elemento è esplicito, utilizza questa costante come chiave e la costante lungaMETADATA_VALUE_ATTRIBUTE_PRESENTcome valore.
Queste costanti possono essere utilizzate solo negli extra della descrizione di MediaItem:
DESCRIPTION_EXTRAS_KEY_COMPLETION_STATUS: indica lo stato di completamento dei contenuti di lunga durata, come episodi di podcast e audiolibri. Utilizza questa costante come chiave. Queste costanti intere sono valori possibili:DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_NOT_PLAYED: l'elemento non è stato riprodotto.DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_PARTIALLY_PLAYED: l'elemento è stato riprodotto parzialmente e la posizione corrente è a metà.DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_FULLY_PLAYED: l'elemento è stato completato.
DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE: indica l'avanzamento del completamento dei contenuti di lunga durata come valore double compreso tra 0.0 e 1.0, inclusi. In questo modo vengono fornite ulteriori informazioni sullo statoPARTIALLY_PLAYING, consentendo ad Android Auto o AAOS di visualizzare un indicatore di avanzamento più significativo, ad esempio una barra di avanzamento. Se utilizzi questo extra, consulta Aggiornare la barra di avanzamento nella visualizzazione di navigazione durante la riproduzione dei contenuti per scoprire come mantenere aggiornato questo indicatore dopo l'impressione iniziale.
Per visualizzare gli indicatori che vengono visualizzati mentre l'utente naviga nell'albero di navigazione multimediale, crea un pacchetto di extra che includa una o più di queste costanti.
Poi, passa il pacchetto al metodo MediaDescription.Builder.setExtras.
Questo snippet mostra come visualizzare gli indicatori per un elemento multimediale esplicito completato al 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 */);
Per visualizzare gli indicatori per un elemento multimediale in riproduzione, dichiara i valori per METADATA_KEY_IS_EXPLICIT o EXTRA_DOWNLOAD_STATUS in MediaMetadataCompat di mediaSession.
Questo snippet di codice mostra come indicare che il brano nella visualizzazione di riproduzione è esplicito e scaricato:
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());
Aggiornare la barra di avanzamento nella visualizzazione di navigazione durante la riproduzione dei contenuti
Puoi utilizzare l'DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE extra
per mostrare una barra di avanzamento per i contenuti riprodotti parzialmente nella visualizzazione di navigazione.
Tuttavia, se un utente continua a riprodurre i contenuti riprodotti parzialmente, questo indicatore diventa impreciso nel tempo.
Affinché Android Auto e AAOS mantengano aggiornata la barra di avanzamento, fornisci ulteriori informazioni in MediaMetadataCompat e PlaybackStateCompat per collegare i contenuti in corso agli elementi multimediali nella visualizzazione di navigazione.
Affinché un elemento multimediale abbia una barra di avanzamento che si aggiorna automaticamente, devono essere soddisfatti i seguenti requisiti:
Quando viene creato, il
MediaItemdeve inviareDESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGEnei relativi extra con un valore compreso tra0.0e1.0, inclusi.Il
MediaMetadataCompatdeve inviareMETADATA_KEY_MEDIA_IDcon un valore stringa uguale all'ID multimediale passato aMediaItem.Il
PlaybackStateCompatdeve includere un extra con la chiavePLAYBACK_STATE_EXTRAS_KEY_MEDIA_IDche esegue il mapping a un valore stringa uguale all'ID multimediale passato alMediaItem.
Questo snippet di codice mostra come indicare che l'elemento in riproduzione è collegato a un elemento nella visualizzazione di navigazione:
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());
Anche i contenuti non riprodotti o riprodotti completamente possono visualizzare una barra di avanzamento che si aggiorna automaticamente. Ciò si verifica se gli elementi multimediali corrispondenti includono l'extra DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE con un valore di 0.0 (per i contenuti non riprodotti) o 1.0 (per i contenuti riprodotti completamente). Dopo che l'utente ha selezionato questi elementi multimediali, Android Auto e AAOS visualizzano la barra di avanzamento sopra gli altri indicatori di avanzamento.