Implementazione del radiocomando

L'implementazione del controllo della radio si basa su MediaSession e MediaBrowse, che consentono alle app di contenuti multimediali e di assistenti vocali di controllare la radio. Per ulteriori informazioni, consulta Creare app multimediali per le auto su developer.android.com.

Un'implementazione dell'albero di navigazione dei contenuti multimediali è fornita nella libreria car-broadcastradio-support in packages/apps/Car/libs. Questa libreria contiene anche estensioni di ProgramSelector per la conversione in e da URI. Per le implementazioni radio, è consigliabile utilizzare questa libreria per creare la struttura di navigazione associata.

Selettore di sorgenti multimediali

Per garantire una transizione senza interruzioni tra la radio e le altre app visualizzate nei contenuti multimediali, la raccolta car-media-common contiene classi che devono essere integrate nell'app radio. MediaAppSelectorWidgetpuò essere incluso nel file XML dell'app radio (l'icona e il menu a discesa utilizzati nelle app di riferimento per contenuti multimediali e radio):

<com.android.car.media.common.MediaAppSelectorWidget
    android:id="@+id/app_switch_container"
    android:layout_width="@dimen/app_switch_widget_width"
    android:layout_height="wrap_content"
    android:background="@drawable/app_item_background"
    android:gravity="center" />

Questo widget avvia AppSelectionFragment, che mostra un elenco di origini multimediali a cui è possibile passare. Se vuoi un'interfaccia utente diversa da quella fornita, puoi creare un widget personalizzato per avviare AppSelectionFragment quando deve essere visualizzato il selettore.

AppSelectionFragment newFragment = AppSelectionFragment.create(widget,
            packageName, fullScreen);
    newFragment.show(mActivity.getSupportFragmentManager(), null);

Un'implementazione di esempio è fornita nell'implementazione dell'app radio di riferimento, che si trova in packages/apps/Car/Radio.

Specifiche del controllo dettagliato

L'interfaccia MediaSession (tramite MediaSession.Callback) fornisce meccanismi di controllo per il programma radiofonico attualmente in riproduzione:

  • onPlay, onStop. Attiva/disattiva l'audio della riproduzione radio.
  • onPause. Messa in pausa con spostamento nel tempo (se supportata).
  • onPlayFromMediaId. Riproduci qualsiasi contenuto da una cartella di primo livello. Ad esempio, "Fammi ascoltare la radio FM" o "Fammi ascoltare la radio".
  • onPlayFromUri. Riproduci una frequenza specifica. Ad esempio, "Fammi ascoltare 88.5 FM".
  • onSkipToNext, onSkipToPrevious. Sintonizzarsi su una stazione successiva o precedente.
  • onSetRating. Aggiungi o rimuovi elementi dai preferiti.

MediaBrowser espone un MediaItem regolabile su tre tipi di directory di primo livello:

  • (Facoltativo) Programmi (stazioni). Questa modalità viene in genere utilizzata dalle radio con doppio sintonizzatore per indicare tutte le stazioni radio sintonizzabili disponibili nella località dell'utente.
  • Preferiti. I programmi radio aggiunti all'elenco Preferiti, alcuni potrebbero non essere disponibili (fuori dall'area di ricezione).
  • Canali di banda. Tutti i canali fisicamente possibili nella regione attuale (87,9, 88,1, 88,3, 88,5, 88,7, 88,9, 89,1 e così via). Ogni gruppo ha una directory di primo livello separata.
Struttura ad albero di MediaBrowserService
Figura 2. Struttura ad albero di MediaBrowserService

Ogni elemento di ciascuna di queste cartelle (AM/FM/Programmi) è un MediaItem con un URI che può essere utilizzato con MediaSession per l'impostazione. Ogni cartella di primo livello (AM/FM/Programmi) è un MediaItem con un mediaId che può essere utilizzato con MediaSession per attivare la riproduzione ed è a discrezione dell'OEM. Ad esempio, "Fammi ascoltare FM", "Fammi ascoltare AM" e "Fammi ascoltare la radio" sono tutte query radio non specifiche che utilizzano un mediaId da inviare all'app radio OEM. Spetta all'app radio determinare cosa riprodurre dalla richiesta generica e dal mediaId.

MediaSession

Poiché non esiste il concetto di messa in pausa di uno stream di trasmissione, le azioni Riproduci, Metti in pausa e Interrompi non si applicano sempre alla radio. Con la radio, l'azione Interrompi è associata al silenziamento dello stream, mentre Riproduci è associata alla rimozione del silenziamento.

Alcuni sintonizzatori radio (o app) offrono la possibilità di simulare la messa in pausa di uno stream di trasmissione memorizzando i contenuti nella cache e riproducendoli in un secondo momento. In questi casi, utilizza onPause.

La riproduzione da azioni mediaId e URI è pensata per sintonizzarsi su una stazione acquisita dall'interfaccia MediaBrowser. mediaId è una stringa arbitraria fornito dall'app radio per imporre un valore univoco (in modo che un determinato ID indichi un solo elemento) e stabile (in modo che un determinato elemento abbia lo stesso ID per l'intera sessione) con cui identificare una determinata stazione. L'URI avrà uno schema ben definito. In breve, una forma URI di ProgramSelector. Sebbene questo preveda l'attributo univocità, non deve essere stabile, anche se può cambiare quando la stazione passa a una frequenza diversa.

Per impostazione predefinita, onPlayFromSearch non viene utilizzato. È responsabilità del client (app complementare) selezionare un risultato di ricerca dall'albero di MediaBrowser. Trasferire questa responsabilità all'app radio aumenterebbe la complessità, richiederebbe contratti formali su come devono essere visualizzate le query di stringa e comporterebbe un'esperienza utente non uniforme su piattaforme hardware diverse.

Nota: l'app radio non contiene informazioni aggiuntive utili per cercare il nome di una stazione non esposta al client tramite l'interfaccia MediaBrowser.

Il passaggio alla stazione successiva o precedente dipende dal contesto attuale:

  • Quando un'app è sintonizzata su una stazione dall'elenco Preferiti, può passare alla stazione successiva nell'elenco Preferiti.
  • Se ascolti una stazione dall'elenco dei programmi, potresti sintonizzarti sulla stazione successiva disponibile, ordinata in base al numero di canale.
  • L'ascolto di un canale arbitrario potrebbe comportare l'aggiornamento al canale fisico successivo, anche se non è presente alcun segnale di trasmissione.

L'app radio gestisce queste azioni.

Gestione degli errori

TransportControls (Riproduci, Interrompi e Avanti) non fornisce un feedback sul buon esito o meno dell'azione. L'unico modo per indicare un errore è impostare lo stato MediaSession su STATE_ERROR con un messaggio di errore.

L'app radio deve gestire queste azioni ed eseguirle o impostare uno stato di errore. Se l'esecuzione del comando Riproduci non è immediata, lo stato di riproduzione deve essere impostato su STATE_CONNECTING (in caso di sintonizzazione diretta) o STATE_SKIPPING_TO_PREVIOUS o NEXT durante l'esecuzione del comando.

Il cliente deve guardare PlaybackState e verificare che la sessione abbia modificato il programma corrente in base a quanto richiesto o inserito nello stato di errore. STATE_CONNECTING non deve superare i 30 secondi. Tuttavia, la sintonizzazione diretta su una determinata frequenza AM/FM dovrebbe essere molto più rapida.

Aggiungere e rimuovere preferiti

MediaSession supporta la classificazione, che può essere utilizzata per controllare i preferiti. onSetRating chiamata con una valutazione di tipo RATING_HEART aggiunge o rimuove la stazione attualmente sintonizzata dall'elenco Preferiti o viceversa.

A differenza dei preset precedenti, questo modello presuppone un elenco di preferiti non ordinato e illimitato, in cui ogni preferito salvato è stato allocato a uno slot numerico (in genere da 1 a 6). Di conseguenza, i sistemi basati su impostazioni predefinite non sono compatibili con il funzionamento di onSetRating.

La limitazione dell'API MediaSession è che solo la stazione attualmente sintonizzata può essere aggiunta o rimossa. Ad esempio, gli elementi devono essere selezionati prima di poter essere rimossi. Si tratta solo di una limitazione del client MediaBrowser, ad esempio un'app complementare. L'app radio non è soggetta a limitazioni simili. Questa parte è facoltativa quando un'app non supporta i preferiti.

MediaBrowser

Per indicare quali frequenze o nomi di canali fisici (quando la sintonizzazione su un canale arbitrario è adatta per una determinata tecnologia radio) sono validi per una determinata regione, tutti i canali (frequenze) validi sono elencati per ogni banda. Nella regione degli Stati Uniti, si tratta di 101 canali FM nell'intervallo da 87,8 a 108,0 MHz (con spaziatura di 0,2 MHz) e 117 canali AM nell'intervallo da 530 a 1700 kHz (con spaziatura di 10 kHz). Poiché la radio HD utilizza lo stesso spazio del canale, non viene presentata separatamente.

L'elenco dei programmi radio attualmente disponibili è piatto in quanto non consente schemi di visualizzazione come il raggruppamento per ensemble DAB (Digital Audio Broadcasting).

Le voci nell'elenco Preferiti potrebbero non essere regolabili. Ad esempio, se un determinato programma non rientra nell'intervallo. L'app radio potrebbe o meno rilevare se è possibile sintonizzare la voce in anticipo. In questo caso, la voce potrebbe non essere contrassegnata come riproducibile.

Per identificare le cartelle di primo livello, viene applicato lo stesso meccanismo utilizzato dal Bluetooth. In altre parole, un bundle Extra dell'oggetto MediaDescription contiene un campo specifico per l'accordatore, proprio come il Bluetooth con EXTRA_BT_FOLDER_TYPE. Nel caso della radio, questo porta alla definizione dei seguenti nuovi campi nell'API pubblica:

  • EXTRA_BCRADIO_FOLDER_TYPE = "android.media.extra.EXTRA_BCRADIO_FOLDER_TYPE". Uno dei seguenti valori:
    • BCRADIO_FOLDER_TYPE_PROGRAMS = 1. Programmi attualmente disponibili.
    • BCRADIO_FOLDER_TYPE_FAVORITES = 2. Preferiti.
    • BCRADIO_FOLDER_TYPE_BAND = 3. Tutti i canali fisici per una determinata banda.

    Non è necessario definire campi di metadati personalizzati specifici per la radio, poiché tutti i dati pertinenti rientrano nello schema MediaBrowser.MediaItem esistente:

    • Nome del programma (RDS PS, nome del servizio DAB). MediaDescription.getTitle.
    • Frequenza FM. URI (vedi ProgramSelector) o MediaDescription.getTitle (se una voce si trova nella cartella BROADCASTRADIO_FOLDER_TYPE_BAND).
    • Identificatori specifici per le radio (RDS PI, DAB SId). MediaDescription.getMediaUri analizzato in ProgramSelector.

    In genere, non è necessario recuperare la frequenza FM per una voce del programma corrente o dell'elenco Preferiti (poiché il client deve operare sugli ID media). Tuttavia, se si dovessero verificare queste esigenze (ad esempio, per la visualizzazione), il valore è presente nell'URI e può essere analizzato in ProgramSelector. Detto questo, non è consigliabile utilizzare l'URI per selezionare elementi all'interno della sessione corrente. Per maggiori dettagli, consulta ProgramSelector.

    Per evitare problemi di prestazioni o relativi al binder, il servizio MediaBrowser deve supportare la paginazione:

    Nota: per impostazione predefinita, la paginazione è implementata nella variante onLoadChildren() senza gestione delle opzioni.

    Le voci correlate di tutti i tipi di elenchi (canali non elaborati, programmi trovati e preferiti) possono avere mediaId diversi (dipende dall'app di radio; la biblioteca di supporto li avrà diversi). Gli URI (nel modulo ProgramSelector) differiscono tra i canali non elaborati e i programmi trovati nella maggior parte dei casi (ad eccezione della FM senza RDS), ma sono per lo più uguali tra i programmi trovati e i preferiti (ad eccezione, ad esempio, quando l'AF è stato aggiornato).

    Avere mediaId diversi per le voci di diversi tipi di elenchi consente di eseguire azioni diverse su di essi. Puoi sfogliare l'elenco Preferiti o l'elenco Tutti i programmi su onSkipToNext, a seconda della cartella di MediaItem selezionata di recente (vedi MediaSession).

    Azioni di accordatura speciali

    L'elenco dei programmi consente agli utenti di sintonizzarsi su una stazione specifica, ma non consente di effettuare richieste generali come "Sintonizza su FM", che potrebbe comportare la sintonizzazione su una stazione ascoltata di recente sulla banda FM.

    Per supportare queste azioni, alcune directory di primo livello hanno il flag FLAG_PLAYABLE impostato (insieme a FLAG_BROWSABLE per le cartelle).

    Azione Sintonizza su Come emettere
    Ascoltare la radio Qualsiasi canale radio startService(ACTION_PLAY_BROADCASTRADIO)

    OPPURE

    playFromMediaId(MediaBrowser.getRoot())
    Fammi ascoltare la radio FM Qualsiasi canale FM Riproduci dalla frequenza mediaId della banda FM.

    La scelta del programma da sintonizzare è a discrezione dell'app. In genere, si tratta del canale sintonizzato più di recente nell'elenco specificato. Per informazioni dettagliate su ACTION_PLAY_BROADCASTRADIO, consulta Intent di gioco generali.

    Discovery e connessione dei servizi

    PackageManager può trovare direttamente l'albero MediaBrowserService che pubblica la radio broadcasting. Per farlo, chiama resolveService con l'intent ACTION_PLAY_BROADCASTRADIO (vedi Intent di riproduzione generale) e il flag MATCH_SYSTEM_ONLY. Per trovare tutti i servizi che trasmettono radio (potrebbero essere più di uno, ad esempio AM/FM e satellitari separati), usa queryIntentServices.

    Il servizio risolto gestisce anche l'intent android.media.browse.MediaBrowserService bind. Questo viene verificato con il GTS.

    Per connetterti a MediaBrowserService selezionato, crea un'istanza MediaBrowser per un determinato componente di servizio e connect. Dopo aver stabilito la connessione, è possibile ottenere un handle per MediaSession tramite getSessionToken.

    L'app Radio può limitare i pacchetti client autorizzati a connettersi in un'implementazione onGetRoot del servizio. L'app dovrebbe consentire alle app di sistema di connettersi senza essere inserite nella lista consentita. Per maggiori dettagli sull'inserimento nella lista consentita, consulta Accettare il pacchetto e la firma dell'app Assistente.

    Se l'app specifica per l'origine (ad esempio un'app di radio) è installata su un dispositivo senza l'appoggio di questa origine, continuerà a pubblicizzarsi come gestore dell'intent ACTION_PLAY_BROADCASTRADIO, ma la sua struttura MediaBrowser non conterrà i tag specifici per la radio. Pertanto, un client che vuole verificare se una determinata fonte è disponibile su un dispositivo deve:

    1. Scopri il servizio radio (chiamare resolveService per ACTION_PLAY_BROADCASTRADIO).
    2. Crea MediaBrowser e connettiti.
    3. Determina la presenza di MediaItem con EXTRA_BCRADIO_FOLDER_TYPE extra.

    Nota: nella maggior parte dei casi, il client deve eseguire la scansione di tutti gli alberi MediaBrowser disponibili per rilevare tutte le sorgenti disponibili per un determinato dispositivo.

    Nomi delle bande

    L'elenco di bande è rappresentato da un insieme di directory di primo livello con un tag di tipo di cartella impostato su BCRADIO_FOLDER_TYPE_BAND. I titoli dei MediaItem sono stringhe localizzate che rappresentano i nomi delle bande. Nella maggior parte dei casi sarà uguale alla traduzione in inglese, ma il cliente non può fare affidamento su questa supposizione.

    Per fornire un meccanismo stabile per la ricerca di determinate bande, viene aggiunto un tag extra per le cartelle delle bande, EXTRA_BCRADIO_BAND_NAME_EN. Si tratta di un nome non localizzato della banda e può assumere solo uno di questi valori predefiniti:

    • AM
    • FM
    • DAB

    Se la banda non è presente in questo elenco, il tag del nome della banda non deve essere impostato. Tuttavia, se il gruppo è presente nell'elenco, deve avere un tag impostato. La radio HD non elenca bande separate perché utilizza lo stesso mezzo di base di AM/FM.

    Intenzioni di gioco generali

    Ogni app dedicata alla riproduzione di una determinata sorgente (ad esempio radio o CD) deve gestire un intento di riproduzione generale per avviare la riproduzione di alcuni contenuti eventualmente da stato inattivo (ad esempio dopo l'avvio). Spetta all'app selezionare i contenuti da riprodurre, ma in genere si tratta del programma radio o della traccia del CD riprodotti di recente.Per ogni sorgente audio è definito un intento distinto:

    • android.car.intent.action.PLAY_BROADCASTRADIO
    • android.car.intent.action.PLAY_AUDIOCD: CD-DA o CD-Text
    • android.car.intent.action.PLAY_DATADISC: disco dati ottico come CD/DVD, ma non CD-DA (potrebbe essere un CD in modalità mista)
    • android.car.intent.action.PLAY_AUX: senza specificare la porta AUX
    • android.car.intent.action.PLAY_BLUETOOTH
    • android.car.intent.action.PLAY_USB: senza specificare quale dispositivo USB
    • android.car.intent.action.PLAY_LOCAL: archiviazione multimediale locale (flash integrato)

    Gli intent sono stati scelti per essere utilizzati per il comando di riproduzione generale perché risolvono contemporaneamente due problemi: il comando di riproduzione generale stesso e il rilevamento dei servizi. Un ulteriore vantaggio di avere questo intento sarebbe la possibilità di eseguire un'azione così semplice senza aprire la sessione MediaBrowser.

    La scoperta dei servizi è in realtà il problema più importante risolto con questi intent. In questo modo, la procedura di rilevamento dei servizi è facile e inequivocabile (consulta Rilevamento e connessione dei servizi).

    Per semplificare alcune implementazioni del client, esiste un modo alternativo per eseguire questo comando di riproduzione (che deve essere implementato anche dall'app radio): eseguire playFromMediaId con il rootId del nodo principale (utilizzato come mediaId). Anche se il nodo principale non è destinato a essere riprodotto, il suo rootId è una stringa arbitraria che può essere resa utilizzabile come mediaId. Tuttavia, i clienti non sono tenuti a comprendere questa sfumatura.

    ProgramSelector

    Sebbene mediaId sia sufficiente per selezionare un canale da MediaBrowserService, diventa vincolato a una sessione e non è coerente tra i fornitori. In alcuni casi il client potrebbe aver bisogno di un indicatore assoluto (ad esempio una frequenza assoluta) per mantenerlo tra sessioni e dispositivi.

    Nell'era delle trasmissioni radio digitali, una frequenza non è sufficiente per sintonizzarsi su una stazione specifica. Pertanto, usa ProgramSelector per sintonizzarti su un canale analogico o digitale. ProgramSelector è costituito da due parti:

    • Identificatore principale. Un identificatore univoco e stabile per una determinata stazione radio che non cambia, ma potrebbe non essere sufficiente per sintonizzarti su quella stazione. Ad esempio, il codice PI RDS, che può essere tradotto in indicativo di chiamata negli Stati Uniti.
    • Identificatori secondari. Identificatori aggiuntivi utili per sintonizzare la stazione (ad es. frequenza), eventualmente inclusi identificatori di altre tecnologie radio. Ad esempio, una stazione DAB potrebbe avere un fallback di trasmissione analogica.

    Per consentire a ProgramSelector di adattarsi alla soluzione basata su MediaBrowser o MediaSession, definisci uno schema URI per serializzarlo. Lo schema è definito come segue:

    broadcastradio://program/<primary ID type>/<primary ID>?
    <secondary ID type>=<secondary ID>&<secondary ID type>=<secondary ID>

    In questo esempio, la parte relativa agli identificatori secondari (dopo il punto interrogativo (?)) è facoltativa e può essere rimossa per fornire un identificatore stabile da utilizzare come mediaId. Ad esempio:

    • broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=88500&AMFM_FREQUENCY=103300
    • broadcastradio://program/AMFM_FREQUENCY/102100
    • broadcastradio://program/DAB_SID_EXT/14895264?RDS_PI=1234

    La parte di autorità (ovvero l'host) di program offre spazio per l'estensione dello schema in futuro. Le stringhe di tipo di identificatore sono specificate con precisione come nomi nella definizione di IdentifierType di HAL 2.x e il formato del valore è un numero decimale o esadecimale (con prefisso 0x).

    Tutti gli identificatori specifici del fornitore sono rappresentati dal prefisso VENDOR_. Ad esempio, VENDOR_0 per VENDOR_START e VENDOR_1 per VENDOR_START più 1. Questi URI sono specifici per l'hardware radio su cui sono stati generati e non possono essere trasferiti da un dispositivo all'altro se sono stati prodotti da OEM diversi.

    Questi URI devono essere assegnati a ogni MediaItem nelle cartelle radio di primo livello. Inoltre, MediaSession deve supportare sia playFromMediaId che playFromUri. Tuttavia, l'URI è principalmente destinato all'estrazione dei metadati radio (ad esempio la frequenza FM) e allo spazio di archiviazione permanente. Non è garantito che l'URI sarà disponibile per tutti gli elementi multimediali (ad esempio, quando il tipo di ID principale non è ancora supportato dal framework). Al contrario, l'ID media funziona sempre. È sconsigliato che i client utilizzino gli URI per selezionare elementi dalla sessione MediaBrowser corrente. Utilizza invece playFromMediaId. Detto questo, non è facoltativo per l'app di pubblicazione e gli URI mancanti sono riservati a casi ben giustificati.

    Il progetto iniziale utilizzava un solo due punti anziché la sequenza :// dopo la parte dello schema. Tuttavia, il primo non è supportato da android.net.Uri per i riferimenti URI gerarchici assoluti.

    Altri tipi di origini

    Altre sorgenti audio possono essere gestite in modo simile. Ad esempio, l'ingresso ausiliario e il lettore CD audio.

    Una singola app può pubblicare più tipi di origini. In questi casi, consigliamo di creare un MediaBrowserService distinto per ogni tipo di origine. Anche in una configurazione con più origini/MediaBrowserServices pubblicate, è vivamente consigliato avere una singola MediaSession all'interno di un'unica app.

    CD audio

    È simile al CD audio in quanto l'app che gestisce questi dischi mostrerebbe MediaBrowser con una singola voce navigabile (o più, se il sistema è dotato di un cambio CD), che a sua volta conterrebbe tutte le tracce di un determinato CD. Se il sistema non conosce le tracce su ogni CD (ad esempio, quando tutti i dischi sono inseriti contemporaneamente in una cartuccia e non li legge tutti), then MediaItem per l'intero disco sarà solo PLAYABLE, non BROWSABLE più PLAYABLE. Se non è presente alcun disco in un determinato slot, l'elemento non sarà né PLAYABLEBROWSABLE (ma ogni slot deve essere sempre presente nell'albero).

     Struttura ad albero del CD audio
    Figura 3. Struttura ad albero del CD audio.

    Queste voci verrebbero contrassegnate in modo simile alle cartelle di radio trasmesse; conterrebbero altri campi aggiuntivi definiti nell'API MediaDescription:

    • EXTRA_CD_TRACK: per ogni MediaItem su CD audio, numero di traccia basato su 1.
    • EXTRA_CD_DISK: numero del disco basato su 1.

    Per il sistema con CD-Text abilitato e il disco compatibile, MediaItem di primo livello avrebbe il titolo del disco. Allo stesso modo, gli elementi MediaItem per i brani avranno il titolo del brano.

    Ingresso ausiliario

    L'app che gestisce l'ingresso ausiliario espone un albero MediaBrowser con una singola voce (o più, se esistono più porte) che rappresenta la porta AUX in. La rispettiva MediaSession prende il suo mediaId e passa a quell'origine dopo aver ricevuto la richiesta playFromMediaId.

    Struttura ad albero AUX
    Figura 4. Struttura ad albero AUX.

    Ogni voce MediaItem AUX avrà un campo aggiuntivo EXTRA_AUX_PORT_NAME impostato sul nome non localizzato della porta senza la frase "AUX". Ad esempio, "AUX 1" deve essere impostato su "1", "AUX front" su "front" e "AUX" su una stringa vuota. Nelle impostazioni internazionali diverse dall'inglese, il tag name rimane la stessa stringa in inglese. È improbabile che per EXTRA_BCRADIO_BAND_NAME_EN i valori siano definiti dall'OEM e non siano vincolati a un elenco predefinito.

    Se l'hardware è in grado di rilevare i dispositivi connessi alla porta AUX, deve contrassegnare MediaItem come PLAYABLE solo se l'ingresso è collegato. L'hardware dovrebbe essere ancora enumerato (ma non PLAYABLE) se non è stato collegato nulla a questa porta. Se l'hardware non dispone di questa funzionalità, MediaItem deve essere sempre impostato su PLAYABLE.

    Campi aggiuntivi

    Definisci i seguenti campi:

    • EXTRA_CD_TRACK = "android.media.extra.CD_TRACK"
    • EXTRA_CD_DISK = "android.media.extra.CD_DISK"
    • EXTRA_AUX_PORT_NAME = "android.media.extra.AUX_PORT_NAME"

    Il cliente deve esaminare gli elementi MediaItem di primo livello per verificare se sono impostati i campi aggiuntivi EXTRA_CD_DISK o EXTRA_AUX_PORT_NAME.

    Esempi dettagliati

    Gli esempi riportati di seguito riguardano la struttura ad albero di MediaBrowser per i tipi di origine che fanno parte di questo design.

    MediaBrowserService per la radio trasmessa (gestisce ACTION_PLAY_BROADCASTRADIO):

    • Stazioni (navigabili)EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_PROGRAMS
      • URI di BBC One (guardabile): broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=90500
      • URI di ABC 88.1 (riproducibile): broadcastradio://program/RDS_PI/5678?AMFM_FREQUENCY=88100
      • URI di ABC 88.1 HD1 (leggibile): broadcastradio://program/HD_STATION_ID_EXT/158241DEADBEEF?AMFM_FREQUENCY=88100&RDS_PI=5678
      • URI di ABC 88.1 HD2 (riproducibile): broadcastradio://program/HD_STATION_ID_EXT/158242DEADBEFE
      • 90.5 FM (riproducibiile) - FM senza RDSURI: broadcastradio://program/AMFM_FREQUENCY/90500
      • URI 620 AM (riproducibile): broadcastradio://program/AMFM_FREQUENCY/620
      • URI BBC One (leggibile): broadcastradio://program/DAB_SID_EXT/1E24102?RDS_PI=1234
    • Preferiti (esplorabili, riproducibili)EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_FAVORITES
      • URI BBC One (leggibile): broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=101300
      • URI BBC Two (non riproducibile): broadcastradio://program/RDS_PI/1300?AMFM_FREQUENCY=102100
    • AM (esplorabile, riproducibile): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="AM"
      • URI 530 AM (ascoltabile): broadcastradio://program/AMFM_FREQUENCY/530
      • URI 540 AM (riproducibile): broadcastradio://program/AMFM_FREQUENCY/540
      • URI 550 AM (leggibile): broadcastradio://program/AMFM_FREQUENCY/550
    • FM (navigabile, riproducibile): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="FM"
      • URI 87,7 FM (riproducibile): broadcastradio://program/AMFM_FREQUENCY/87700
      • 87,9 FM (ascoltabile) URI: broadcastradio://program/AMFM_FREQUENCY/87900
      • URI 88.1 FM (ascoltabile): broadcastradio://program/AMFM_FREQUENCY/88100
    • DAB (riproducibile): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="DAB"

    MediaBrowserService per CD audio (gestisce ACTION_PLAY_AUDIOCD):

    • Disco 1 (leggibile) EXTRA_CD_DISK=1
    • Disco 2 (navigabile, riproducibile) EXTRA_CD_DISK=2
      • Traccia 1 (riproducibiile) EXTRA_CD_TRACK=1
      • Canale 2 (ascoltabile) EXTRA_CD_TRACK=2
    • Il mio CD musicale (navigabile, riproducibile) EXTRA_CD_DISK=3
      • All By Myself (disponibile) EXTRA_CD_TRACK=1
      • Reise, Reise (disponibile) EXTRA_CD_TRACK=2
    • Slot 4 vuoto (non riproducibile) EXTRA_CD_DISK=4

    AUX MediaBrowserService (gestisce ACTION_PLAY_AUX):

    • AUX anteriore (riproducibile) EXTRA_AUX_PORT_NAME="front"
    • AUX posteriore (riproducibile) EXTRA_AUX_PORT_NAME="rear"