Implementación del control de radio

La implementación del control de radio se basa en MediaSession y MediaBrowse, que permiten que las apps multimedia y del asistente de voz hagan lo siguiente: controlar la radio. Para obtener más información, consulta Cómo compilar apps multimedia para vehículos en developer.android.com.

En el campo car-broadcastradio-support se proporciona una implementación del árbol de navegación multimedia biblioteca en packages/apps/Car/libs. Esta biblioteca también contiene extensiones de ProgramSelector para realizar la conversión desde y hacia el URI. Se recomienda que las implementaciones de radio usar esta biblioteca para compilar el árbol de navegación asociado.

Selector de fuente multimedia

Para proporcionar una transición fluida entre la radio y otras apps que se muestran en el contenido multimedia, La biblioteca auto-media-common contiene clases que se deben integrar en la radio . MediaAppSelectorWidget se puede incluir en el XML de la app de radio. (el ícono y el menú desplegable que se usan en las aplicaciones de radio y contenido multimedia de referencia):

<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" />

Este widget inicia el AppSelectionFragment, que muestra un una lista de fuentes multimedia a las que puedes cambiar. Si se desea una IU distinta de la proporcionada, puedes crear un widget personalizado para iniciar el AppSelectionFragment cuando el elemento se debe mostrar el selector.

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

Se proporciona un ejemplo de implementación en la implementación de la app de radio de referencia. ubicado en packages/apps/Car/Radio.

Especificaciones detalladas de los controles

El MediaSession (a través de MediaSession.Callback) proporciona mecanismos de control para el programa de radio que se está reproduciendo en ese momento:

  • onPlay, onStop. (Activa) el sonido de la reproducción de la radio.
  • onPause Pausa por pausa en directo (si es compatible).
  • onPlayFromMediaId Reproducir cualquier contenido de una carpeta de nivel superior Por ejemplo, "Reproduce FM" o "Reproducir la radio".
  • onPlayFromUri Reproducir una frecuencia específica Por ejemplo, "Reproduce 88.5 FM".
  • onSkipToNext, onSkipToPrevious. Sintonizar para anterior o siguiente estación.
  • onSetRating Agrega contenido a Favoritos o quítalo de ellos.

El MediaBrowser expone una configuración MediaItem en tres tipos de directorios de nivel superior:

  • (Opcional) Programas (estaciones). Por lo general, los usuarios de este modo radios de dos sintonizadores para indicar todas las estaciones de radio sintonizables disponibles en la ubicación del usuario.
  • Favoritos. Se agregaron programas de radio a la lista de Favoritos; es posible que algunos no disponible (fuera del rango de recepción).
  • Canales de bandas. Todos los canales posibles físicamente en la región actual (87.9, 88.1, 88.3, 88.5, 88.7, 88.9, 89.1, etc.). Cada banda tiene un directorio independiente de nivel superior.
Estructura de árbol de MediaBrowserService
Figura 2: Estructura de árbol de MediaBrowserService

Cada elemento en cada una de estas carpetas (AM/FM/Programs) es un MediaItem con un URI que puede utilizarse. con MediaSession para ajustarlos. Cada carpeta de nivel superior (AM/FM/Programs) es un MediaItem con un mediaId que se puede usar con MediaSession para activar la reproducción, lo cual queda a discreción del OEM. Para por ejemplo, "Reproducir FM", "Reproducir a.m." y "Reproduce la radio" son todas consultas de radio no específicas que usan un mediaId para enviar a la app de radio del OEM. Depende de la app de radio determinar qué reproducir de la genérica y el mediaId.

MediaSession

Dado que no existe el concepto de pausar una transmisión continua, las acciones Reproducir, Pausar y Detener no siempre se aplican a la radio. Con la radio, la acción Detener se asocia con silenciar la transmisión. mientras que Play está asociado con quitar el sonido.

Algunos sintonizadores de radio (o apps) permiten simular la pausa de una transmisión continua. almacenar en caché el contenido y reproducirlo más tarde. En esos casos, usa onPause.

La reproducción desde acciones mediaId y URI está diseñada para sintonizar una estación. recuperado de la interfaz MediaBrowser. El mediaId es una string arbitraria. proporcionadas por la app de radio para imponer un valor único (de manera que un ID determinado solo apunte a un elemento). y estable (por lo que un determinado elemento tiene el mismo ID en toda la sesión) con el que para identificar una estación determinada. El URI tendrá un esquema bien definido. En resumen, una dirección de correo electrónico de ProgramSelector. Si bien esto conserva el atributo de unicidad, no es necesario ser estable, aunque puede cambiar cuando la estación se mueve a una frecuencia diferente.

Por diseño, no se usa onPlayFromSearch. Es responsabilidad del cliente (app complementaria) para seleccionar un resultado de la búsqueda del árbol de MediaBrowser. Para mudanza que la responsabilidad hacia la aplicación de radio aumentaría la complejidad, requeriría contratos formales sobre Deberían aparecer las consultas de cadenas y generar una experiencia del usuario desigual en diferentes hardware. y plataformas de Google Cloud.

Nota: La app de radio no contiene datos información útil para buscar el nombre de una estación que no esté expuesto al cliente a través de la interfaz MediaBrowser.

Saltar a la estación siguiente o a la anterior depende del contexto actual:

  • Cuando una app se sintoniza a una estación de la lista Favoritos, la app puede pasar a la siguiente estación de la lista de Favoritos.
  • Si escuchas una estación de la lista Program, es posible que se sintonice la siguiente. estación disponible, ordenada según el número de canal.
  • Escuchar un canal arbitrario puede provocar la sintonización del siguiente canal físico. incluso cuando no hay señal de emisión.

La app de radio controla estas acciones.

Manejo de errores

TransportControls acciones (Reproducir, Detener y Siguiente) no proporciona comentarios sobre si la acción tenga éxito o no. La única forma de indicar un error es establecer la MediaSession estado a STATE_ERROR con un mensaje de error.

La app de radio debe controlar esas acciones y ejecutarlas o establecer un estado de error. Si la ejecución del comando de reproducción no es inmediata, el estado de reproducción se debe cambiar a STATE_CONNECTING (en caso de sintonía directa) o STATE_SKIPPING_TO_PREVIOUS o NEXT mientras se ejecuta el comando.

El cliente debe mirar PlaybackState. y verificar que la sesión haya cambiado el programa actual por lo que se solicitó o ingresó al estado de error. STATE_CONNECTING no debe superar los 30 segundos. Sin embargo, una melodía directa con un La frecuencia AM/FM debería funcionar mucho más rápido.

Agregar y quitar favoritos

MediaSession es compatible con las clasificaciones, que se pueden usar para controlar los Favoritos. onSetRating llamado con una calificación de tipo RATING_HEART agrega o elimina la estación sintonizada actualmente en o desde la lista de Favoritos.

Al contrario de los ajustes predeterminados heredados, este modelo supone un Favoritos desordenado y no delimitado , cuando cada favorito guardado se asignó a un espacio numérico (por lo general, de 1 a 6). Por lo tanto, los sistemas basados en ajustes predeterminados no serían compatibles con onSetRating. una sola operación.

La limitación de la API de MediaSession es que solo la estación está sintonizada actualmente que se pueden agregar o quitar. Por ejemplo, los elementos se deben seleccionar primero antes de se puede quitar. Esta es solo una limitación del cliente MediaBrowser, como un aplicación complementaria. La app de radio no tiene restricciones similares. Esta parte es opcional. cuando una app no admite Favoritos.

MediaBrowser

Para expresar qué frecuencias o nombres de canales físicos (al sintonizar a un canal arbitrario es adecuada para una determinada tecnología de radio) son válidas para en una región determinada, se enumeran todos los canales válidos (frecuencias) para cada banda. En la región de EE.UU., esto equivale a 101 canales FM, del rango de 87.8 a Rango de 108.0 MHz (con espaciado de 0.2 MHz) y 117 canales de AM en el rango de 530 hasta 1,700 kHz (con espaciado de 10 kHz). Debido a que la radio HD usa el mismo espacio de canales, no se presenta por separado.

La lista de programas de radio disponibles actualmente es plana, ya que no permite esquemas de visualización, como la agrupación por transmisión de audio directo (DAB).

Es posible que no se puedan ajustar las entradas de la lista de Favoritos. Por ejemplo, si un determinado el programa está fuera del rango. La app de radio podría o no detectar si la entrada que se puede ajustar de antemano. Si es así, es posible que no se marque la entrada como reproducible.

Para identificar las carpetas de nivel superior, se aplica el mismo mecanismo que usa Bluetooth. Es decir, un paquete de Extras del MediaDescription contiene un campo específico del sintonizador, al igual que Bluetooth con EXTRA_BT_FOLDER_TYPE. En el caso de la radiofrecuencia, esto conduce a la definición de los siguientes campos nuevos en el API pública:

  • EXTRA_BCRADIO_FOLDER_TYPE = "android.media.extra.EXTRA_BCRADIO_FOLDER_TYPE" Uno de los siguientes valores:
    • BCRADIO_FOLDER_TYPE_PROGRAMS = 1 Programas disponibles actualmente.
    • BCRADIO_FOLDER_TYPE_FAVORITES = 2 Favoritos.
    • BCRADIO_FOLDER_TYPE_BAND = 3 Todos los canales físicos de una banda determinada.

    No es necesario definir ningún campo de metadatos personalizados específicos para radios, ya que los datos relevantes se ajustan al esquema MediaBrowser.MediaItem existente:

    • Nombre del programa (RDS PS, nombre del servicio DAB). MediaDescription.getTitle.
    • Frecuencia FM URI (consulta ProgramSelector) o MediaDescription.getTitle (si una entrada está en la carpeta BROADCASTRADIO_FOLDER_TYPE_BAND).
    • Identificadores específicos de radio (RDS PI, DAB SId). Se analizó MediaDescription.getMediaUri en ProgramSelector.

    Por lo general, no es necesario recuperar la frecuencia FM para una entrada en el el programa actual o la lista de Favoritos (ya que el cliente debe operar en los medios de comunicación IDs). Sin embargo, si esa necesidad surgiera (por ejemplo, para fines de visualización), sería presente en el URI y se puede analizar como ProgramSelector. Dicho esto, no se recomienda usar el URI para seleccionar elementos dentro del sesión. Para obtener más información, consulta ProgramSelector

    Para evitar problemas de rendimiento o relacionados con Binder, el servicio MediaBrowser debe admitir la paginación:

    Nota: De forma predeterminada, la paginación se implementa de forma predeterminada en el onLoadChildren() sin control de opciones.

    Entradas relacionadas de todos los tipos de listas (canales sin procesar, programas encontrados y favoritos) pueden tener diferentes mediaIds (depende de la app de radio; la asistencia la biblioteca los tendrán diferentes). Los URI (en formato ProgramSelector) difieren entre los canales sin procesar y los programas que se encuentran en la mayoría de los casos (excepto para FM) sin RDS), pero en su mayoría son iguales entre los programas encontrados y los favoritos (excepto, por ejemplo, cuando se actualizó AF).

    Tener diferentes mediaIds para las entradas de distintos tipos de listas realizar diferentes acciones sobre ellos. Puede recorrer la lista de Favoritos o la lista Todos los programas en onSkipToNext, según la carpeta donde se encuentren MediaItem seleccionadas (consulta MediaSession).

    Acciones de ajuste especiales

    La lista de programas permite a los usuarios sintonizar una estación específica, pero no les permite hacer solicitudes generales, como "Tune to FM", lo que podría provocar un sintonizador escuchó una estación en la banda FM.

    Para permitir estas acciones, algunos directorios de nivel superior tienen la etiqueta FLAG_PLAYABLE marca establecida (junto con FLAG_BROWSABLE para las carpetas).

    Acción Sintonía para Cómo emitirlo
    Reproducir la radio Cualquier canal de radio startService(ACTION_PLAY_BROADCASTRADIO)

    O

    playFromMediaId(MediaBrowser.getRoot())
    Reproducir FM Cualquier canal FM Reproducir desde el mediaId de la banda FM.

    La determinación de qué programa sintonizar depende de la app. Este es por lo general, el canal de la lista que se muestra más recientemente. Para obtener detalles ACTION_PLAY_BROADCASTRADIO, consulta Intents de reproducción generales.

    Detección y conexión del servicio

    PackageManager puede encontrar directamente el MediaBrowserService que entrega la radio de transmisión. de imágenes. Para ello, llama a resolveService. con el intent ACTION_PLAY_BROADCASTRADIO (consulta Intents de juego generales) y MATCH_SYSTEM_ONLY. Para encontrar todos los servicios de radio (hay puede ser más de uno; por ejemplo, AM/FM y satélite independientes), utiliza queryIntentServices

    El servicio resuelto controla la vinculación android.media.browse.MediaBrowserService también tiene un alto nivel de intención. Esto se verifica con GTS.

    Para conectarte al MediaBrowserService seleccionado, crear Instancia MediaBrowser para un componente de servicio determinado y connect. Después de establecer la conexión, se puede obtener un handle para MediaSession a través de getSessionToken

    La app Radio puede restringir los paquetes cliente que pueden conectarse en un onGetRoot implementación de su servicio. La app debería permitir que las apps del sistema se conecten sin incluirla en la lista blanca. Para obtener más información sobre las listas blancas, consulta Acepta el paquete y la firma de la app de Asistente.

    Si la app específica de la fuente (por ejemplo, una app de radio) está instalada en un dispositivo sin dicha compatibilidad con la fuente, se anunciaría de todas formas que maneja el ACTION_PLAY_BROADCASTRADIO, pero su árbol MediaBrowser no No deben contener etiquetas específicas para cada radio. Por lo tanto, un cliente que está dispuesto a comprobar si un determinado fuente está disponible en un dispositivo, debe:

    1. Descubre el servicio de radio (llama al resolveService para ACTION_PLAY_BROADCASTRADIO).
    2. Crea MediaBrowser y, luego, conéctate a ella.
    3. Determina la presencia de MediaItem con EXTRA_BCRADIO_FOLDER_TYPE adicionales.

    Nota: En la mayoría de los casos, el cliente debe analizar todos Árboles de MediaBrowser disponibles para detectar todas las fuentes disponibles para un dispositivo determinado.

    Nombres de correas

    La lista de bandas se representa mediante un conjunto de directorios de nivel superior con un tipo de carpeta se configuró la etiqueta en BCRADIO_FOLDER_TYPE_BAND. Sus MediaItem son cadenas localizadas que representan los nombres de las bandas. En la mayoría de los casos, será lo mismo que la traducción al inglés, pero el cliente no puede depender de esa suposición.

    Para proporcionar un mecanismo estable para buscar ciertas bandas, Se agregó una etiqueta adicional para las carpetas de la banda, EXTRA_BCRADIO_BAND_NAME_EN. Este es un nombre no localizado de la banda y solo puede tener uno de estos valores predefinidos:

    • AM
    • FM
    • DAB

    Si la banda no está en esta lista, no se debe establecer la etiqueta con el nombre de la banda. Sin embargo, si la banda está en la lista, debe tener una etiqueta establecida. La radio HD no funciona enumera las bandas separadas, ya que usan el mismo medio subyacente que AM/FM.

    Intents de juego generales

    Cada aplicación dedicada a la reproducción de una fuente determinada (como radio o CD) debe procesar un intent general play para comenzar a reproducir contenido que posiblemente sea de inactivo (por ejemplo, después del inicio). Depende de la app cómo seleccionar el contenido para pero suele ser el programa de radio o la pista de CD que se reprodujo recientemente. intent definido para cada fuente de audio:

    • android.car.intent.action.PLAY_BROADCASTRADIO
    • android.car.intent.action.PLAY_AUDIOCD: CD-DA o CD-Text
    • android.car.intent.action.PLAY_DATADISC: como disco de datos óptico CD/DVD, pero no CD-DA (puede ser CD en modo mixto).
    • android.car.intent.action.PLAY_AUX: Sin especificar cuál Puerto AUX
    • android.car.intent.action.PLAY_BLUETOOTH
    • android.car.intent.action.PLAY_USB: Sin especificar cuál Dispositivo USB
    • android.car.intent.action.PLAY_LOCAL: Almacenamiento de contenido multimedia local (Flash integrado)

    Se eligieron los intents para el comando de reproducción general, ya que resuelven dos problemas a la vez: el comando general "play" y la detección de servicios. Un beneficio adicional de tener dicha intención sería la posibilidad de ejecutar tales acción simple sin abrir la sesión de MediaBrowser.

    El descubrimiento de servicios es, de hecho, el problema más importante que se resuelve . El procedimiento para el descubrimiento de servicios es fácil y inequívoco de esta manera (consulta Descubrimiento y conexión del servicio).

    Para facilitar algunas implementaciones de clientes, hay una forma alternativa de emitir dicho comando de Play (que también debe implementar la app de radio): emites playFromMediaId con el rootId del nodo raíz (se usa como mediaId). Si bien el nodo raíz no debe reproducirse, su rootId es una string arbitraria que se puede hacer para que sea consumible como mediaId. Sin embargo, los clientes no son necesarios para entender este matiz.

    Selector de programa

    Si bien mediaId es suficiente para seleccionar un canal del MediaBrowserService, se vincula a una sesión y no es coherente. entre los proveedores. En algunos casos, es posible que el cliente necesite un puntero absoluto (como un absoluta) para mantenerlo entre sesiones y dispositivos.

    En la era de las transmisiones de radio digitales, una frecuencia desnuda no es suficiente para sintonizar una estación específica. Por lo tanto, usa ProgramSelector para ajustar a un canal analógico o digital. ProgramSelector consta de dos partes:

    • Identificador principal. Un identificador único y estable para una radio determinada que no cambia, pero que puede no ser suficiente para sintonizarla. Por ejemplo: Código PI de RDS, que se puede traducir al indicativo de estación de EE.UU.
    • Identificadores secundarios. Identificadores adicionales útiles para el ajuste a esa estación (por ejemplo, frecuencia), posiblemente con identificadores de otros tecnologías de radio. Por ejemplo, una estación de DAB puede tener una reserva de transmisión analógica.

    Para permitir que ProgramSelector se ajuste a MediaBrowser, o Solución basada en MediaSession, define un esquema de URI para serializar. El esquema es se define de la siguiente manera:

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

    En este ejemplo, la parte de identificadores secundarios (después del signo de interrogación (?)) se y se puede quitar para proporcionar un identificador estable que se pueda usar como mediaId. Por ejemplo:

    • 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 de autoridad (también conocida como host) de program proporciona un espacio para extensión del esquema en el futuro. Las cadenas de tipo de identificador se especifican con precisión como sus nombres en la definición de IdentifierType de HAL 2.x y el valor es un número decimal o hexadecimal (con prefijo 0x).

    Todos los identificadores específicos de proveedores están representados por el VENDOR_. . Por ejemplo, VENDOR_0 para VENDOR_START y VENDOR_1 para VENDOR_START más 1. Esos URIs son específicos de el hardware de radio en el que se generaron y que no se pueden transferir entre dispositivos de diferentes OEMs.

    Estos URI deben asignarse a cada elemento MediaItem en el radio de nivel superior. individuales. Además, MediaSession debe admitir playFromMediaId y playFromUri. Sin embargo, el URI está destinado principalmente a la radio. la extracción de metadatos (como la frecuencia FM) y el almacenamiento persistente. No hay garantizar que el URI esté disponible para todos los elementos multimedia (por ejemplo, cuando el evento El framework aún no admite ese tipo de ID). Por otro lado, Media ID siempre funciona. No se recomienda que los clientes usen el URI para seleccionar elementos del sesión actual de MediaBrowser. En su lugar, usa playFromMediaId. Dicho esto, es no es opcional para la app entregada, y los URI faltantes se reservan para casos bien justificados.

    En el diseño inicial, se usaron solo dos puntos en lugar de la secuencia ://. después de la parte del esquema. Sin embargo, la primera no es respaldada por android.net.Uri para referencias de URI jerárquicas absolutas.

    Otros tipos de fuentes

    Se pueden controlar otras fuentes de audio de manera similar. Por ejemplo, las entradas auxiliares el reproductor de CD de audio.

    Una sola app puede entregar varios tipos de fuentes. En esos casos, se recomienda crear un MediaBrowserService separado cada tipo de fuente. Incluso en una configuración con varias fuentes entregadas/MediaBrowserServices, Se recomienda especialmente tener una sola MediaSession dentro de una sola .

    CD de audio

    Al igual que con el CD de audio, la app que funciona con esos discos mostrar MediaBrowser con una sola entrada explorable (o más, si el sistema tiene un de un CD), que a su vez contendría todas las pistas de un CD determinado. Si el sistema no conoce las pistas de cada CD (por ejemplo, cuando se se insertan en un cartucho a la vez y no los lee todos) MediaItem para todo el disco sería solo PLAYABLE, no BROWSABLE más PLAYABLE. Si no hay un disco en una espacio determinado, el elemento no será PLAYABLE ni BROWSABLE (pero cada ranura debe estar siempre presente en el árbol).

     Estructura de árbol de los CDs de audio
    Figura 3: Estructura de árbol de los CDs de audio

    Estas entradas se marcarán de manera similar a las carpetas de transmisiones de radio are; contendrán campos adicionales adicionales definidos en la API de MediaDescription:

    • EXTRA_CD_TRACK: Por cada MediaItem en CD de audio, Número de pista basado en 1.
    • EXTRA_CD_DISK: Es el número de disco basado en 1.

    En el caso del sistema habilitado para CD-Text y el disco compatible, el MediaItem de nivel superior se tener un título del disco. Del mismo modo, los MediaItems de las pistas tendrían una título de la pista.

    Entrada auxiliar

    La app que entrega entradas auxiliares expone un árbol de MediaBrowser con una sola entrada (o más, cuando existen varios puertos) que representan el modo AUX en el puerto. La MediaSession respectiva toma su mediaId y cambia a esa fuente después de recibir la solicitud playFromMediaId.

    Estructura de árbol de AUX
    Figura 4: Estructura de árbol de AUX

    Cada entrada de MediaItem AUX tendría un campo adicional EXTRA_AUX_PORT_NAME configurado en el nombre no localizado del puerto sin "AUX" frase. Por ejemplo, "AUX 1" se habría establecido en "1", "AUX" frente" a "frontal" y "AUX" en una cadena vacía. En las configuraciones regionales que no están en inglés, el nombre etiqueta se mantendrá en la misma cadena en inglés. Improbable en cuanto a EXTRA_BCRADIO_BAND_NAME_EN, los valores están definidos por el OEM y no está restringida a una lista predefinida.

    Si el hardware puede detectar dispositivos conectados al puerto AUX, el hardware debe marcar MediaItem como PLAYABLE, solo si la entrada está conectada. El hardware debe aún se enumera (pero no PLAYABLE) si no hay nada relacionado con esto. puerto de red. Si el hardware no posee dicha capacidad, el objeto MediaItem siempre debe configurarse en PLAYABLE

    Campos adicionales

    Define los siguientes campos:

    • 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"

    El cliente necesita revisar los MediaItems de nivel superior para los elementos que tienen el EXTRA_CD_DISK o EXTRA_AUX_PORT_NAME campo adicional automático.

    Ejemplos detallados

    Los siguientes ejemplos abordan la estructura de árbol de MediaBrowser para los tipos de origen que se parte de este diseño.

    Transmisión de radio MediaBrowserService (controla ACTION_PLAY_BROADCASTRADIO):

    • Estaciones (explorables)EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_PROGRAMS
      • URI de BBC One (jugable): broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=90500
      • URI de ABC 88.1 (reproducible): broadcastradio://program/RDS_PI/5678?AMFM_FREQUENCY=88100
      • URI de ABC 88.1 HD1 (reproducible): broadcastradio://program/HD_STATION_ID_EXT/158241DEADBEEF?AMFM_FREQUENCY=88100&RDS_PI=5678
      • URI de ABC 88.1 HD2 (reproducible): broadcastradio://program/HD_STATION_ID_EXT/158242DEADBEFE
      • 90.5 FM (reproducible), FM sin RDSURI: broadcastradio://program/AMFM_FREQUENCY/90500
      • URI de 620 a.m. (reproducible): broadcastradio://program/AMFM_FREQUENCY/620
      • URI de BBC One (jugable): broadcastradio://program/DAB_SID_EXT/1E24102?RDS_PI=1234
    • Favoritos (se puede explorar y jugar)EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_FAVORITES
      • URI de BBC One (jugable): broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=101300
      • URI de BBC Two (no reproducible): broadcastradio://program/RDS_PI/1300?AMFM_FREQUENCY=102100
    • AM (explorable, reproducible): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="AM"
      • URI (jugable) de las 530 a.m.: broadcastradio://program/AMFM_FREQUENCY/530
      • URI (reproducible) de 540 a.m.: broadcastradio://program/AMFM_FREQUENCY/540
      • URI de 550 a.m. (reproducible): broadcastradio://program/AMFM_FREQUENCY/550
    • FM (explorable, reproducible): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="FM"
      • 87.7 URI de FM (reproducible): broadcastradio://program/AMFM_FREQUENCY/87700
      • 87.9 URI de FM (reproducible): broadcastradio://program/AMFM_FREQUENCY/87900
      • 88.1 URI de FM (reproducible): broadcastradio://program/AMFM_FREQUENCY/88100
    • DAB (se puede reproducir): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="DAB"

    CD de audio MediaBrowserService (controla ACTION_PLAY_AUDIOCD):

    • Disco 1 (reproducible) EXTRA_CD_DISK=1
    • Disco 2 (explorable y reproducible) EXTRA_CD_DISK=2
      • Pista 1 (se puede reproducir) EXTRA_CD_TRACK=1
      • Pista 2 (se puede reproducir) EXTRA_CD_TRACK=2
    • Mi CD de música (que se puede explorar y reproducir) EXTRA_CD_DISK=3
      • Solo para mí (jugable) EXTRA_CD_TRACK=1
      • Reise, Reise (jugable) EXTRA_CD_TRACK=2
    • Espacio vacío 4 (no se puede reproducir) EXTRA_CD_DISK=4

    AUX MediaBrowserService (controla ACTION_PLAY_AUX):

    • AUX delantera (reproducible) EXTRA_AUX_PORT_NAME="front"
    • AUX trasera (se puede reproducir) EXTRA_AUX_PORT_NAME="rear"