Implementación del control de radio

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

Se proporciona una implementación de árbol de exploración de contenido multimedia en la biblioteca car-broadcastradio-support en packages/apps/Car/libs. Esta biblioteca también contiene extensiones de ProgramSelector para convertir de URI y a URI. Se recomienda que las implementaciones de radio usen esta biblioteca para compilar el árbol de navegación asociado.

Selector de fuentes multimedia

Para proporcionar una transición fluida entre la radio y otras apps que se muestran en el contenido multimedia, la biblioteca car-media-common contiene clases que se deben integrar en la app de radio. MediaAppSelectorWidget se puede incluir en el XML de la app de radio (el ícono y el menú desplegable que se usan en las apps de radio y 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 AppSelectionFragment, que muestra una lista de fuentes de contenido multimedia a las que se puede cambiar. Si se desea una IU distinta de la proporcionada, puedes crear un widget personalizado para iniciar el AppSelectionFragment cuando se deba mostrar el selector.

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

Se proporciona una implementación de ejemplo en la implementación de la app de radio de referencia, que se encuentra en packages/apps/Car/Radio.

Especificaciones detalladas del control

La interfaz MediaSession (a través de MediaSession.Callback) proporciona mecanismos de control para el programa de radio que se está reproduciendo:

  • onPlay, onStop. Activar o desactivar la reproducción de la radio.
  • onPause. Pausa en directo (si es compatible).
  • onPlayFromMediaId. Reproducir cualquier contenido de una carpeta de nivel superior Por ejemplo, "Reproduce FM" o "Reproduce radio".
  • onPlayFromUri. Reproduce una frecuencia específica. Por ejemplo, "Reproduce 88.5 FM".
  • onSkipToNext, onSkipToPrevious. Sintonizar una estación siguiente o anterior
  • onSetRating. Agrega o quita elementos de Favoritos.

MediaBrowser expone un MediaItem ajustable en tres tipos de directorios de nivel superior:

  • (Opcional) Programas (estaciones). Por lo general, las radios con sintonizador doble usan este modo para indicar todas las estaciones de radio sintonizables disponibles en la ubicación del usuario.
  • Favoritos. Programas de radio agregados a la lista de favoritos. Es posible que algunos no estén disponibles (fuera del rango de recepción).
  • Canales de banda Todos los canales físicamente posibles en la región actual (87.9, 88.1, 88.3, 88.5, 88.7, 88.9, 89.1, etcétera). Cada banda tiene un directorio de nivel superior independiente.
Estructura de árbol de MediaBrowserService
Figura 2. Estructura de árbol de MediaBrowserService

Cada elemento de cada una de estas carpetas (AM/FM/Programs) es un MediaItem con un URI que se puede usar con MediaSession para sintonizar. 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 y queda a discreción del OEM. Por ejemplo, "Reproduce FM", "Reproduce AM" y "Reproduce radio" son 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 desde la solicitud genérica y el mediaId.

MediaSession

Dado que no hay un concepto de pausar una transmisión de emisión, las acciones de Reproducir, Pausar y Detener no siempre se aplican a la radio. En el caso de la radio, la acción Detener está asociada con silenciar la transmisión, mientras que Reproducir está asociada con quitar el silenciamiento.

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

La reproducción desde acciones de mediaId y URI está diseñada para sintonizar una estación recuperada de la interfaz de MediaBrowser. El mediaId es una cadena arbitraria que proporciona la app de radio para imponer un valor único (para que un ID determinado apunte a un solo elemento) y estable (para que un elemento determinado tenga el mismo ID durante toda la sesión) con el que identificar una estación determinada. El URI tendrá un esquema bien definido. En resumen, es una forma URI de ProgramSelector. Si bien esto preserva el atributo de unicidad, no es necesario que sea estable, aunque puede cambiar cuando la estación se mueve a una frecuencia diferente.

De forma predeterminada, no se usa onPlayFromSearch. Es responsabilidad del cliente (app complementaria) seleccionar un resultado de la búsqueda del árbol de MediaBrowser. Transferir esa responsabilidad a la app de radio aumentaría la complejidad, requeriría contratos formales sobre cómo deben aparecer las consultas de cadenas y generaría una experiencia del usuario desigual en diferentes plataformas de hardware.

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

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

  • Cuando una app sintoniza una estación de la lista de Favoritos, puede pasar a la siguiente estación de la lista.
  • Escuchar una estación de la lista de programas puede hacer que se sintonize la siguiente estación disponible, ordenada según el número de canal.
  • Escuchar un canal arbitrario puede hacer que se sintonize el siguiente canal físico, incluso cuando no hay señal de transmisión.

La app de radio controla estas acciones.

Manejo de errores

Las acciones de TransportControls (Reproducir, Detener y Siguiente) no proporcionan comentarios sobre si la acción se realiza correctamente o no. La única forma de indicar un error es establecer el estado de MediaSession en 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 Play no es inmediata, el estado de reproducción debe cambiarse a STATE_CONNECTING (en el caso de la sintonización directa), STATE_SKIPPING_TO_PREVIOUS o NEXT mientras se ejecuta el comando.

El cliente debe observar el PlaybackState y verificar que la sesión haya cambiado el programa actual al que se solicitó o ingresó en el estado de error. STATE_CONNECTING no debe superar los 30 segundos. Sin embargo, la sintonización directa de una frecuencia AM/FM determinada debería ser mucho más rápida.

Cómo agregar y quitar favoritos

MediaSession admite clasificaciones, que se pueden usar para controlar los favoritos. onSetRating llamado con una calificación de tipo RATING_HEART agrega o quita la estación sintonizada actualmente a la lista de Favoritos o de ella.

A diferencia de los parámetros de configuración heredados, este modelo supone una lista de Favoritos desordenada y sin límites, en la que cada favorito guardado se asignó a un espacio numérico (por lo general, de 1 a 6). Como resultado, los sistemas basados en parámetros predeterminados no serían compatibles con la operación de onSetRating.

La limitación de la API de MediaSession es que solo se puede agregar o quitar la estación a la que se está sintonizando. Por ejemplo, primero se deben seleccionar los elementos para poder quitarlos. Esta es solo una limitación del cliente de MediaBrowser, como una app complementaria. La app de radio no tiene una restricción similar. Esta parte es opcional cuando una app no admite Favoritos.

MediaBrowser

Para expresar qué frecuencias o nombres de canales físicos (cuando la sintonización en un canal arbitrario es adecuada para una tecnología de radio determinada) son válidos para una región determinada, todos los canales válidos (frecuencias) se enumeran para cada banda. En la región de EE.UU., esto equivale a 101 canales de FM en el rango de 87.8 a 108.0 MHz (con un espaciado de 0.2 MHz) y 117 canales de AM en el rango de 530 a 1,700 kHz (con un espaciado de 10 kHz). Debido a que la radio HD usa el mismo espacio de canal, 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 conjunto de transmisión de audio directa (DAB).

Es posible que las entradas de la lista de favoritos no se puedan ajustar. Por ejemplo, si un programa determinado está fuera de rango. La app de radio puede detectar o no si se puede sintonizar la entrada con anticipación. 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 objeto MediaDescription contiene un campo específico del sintonizador, al igual que Bluetooth lo hace con EXTRA_BT_FOLDER_TYPE. En el caso de la radio de transmisión, esto lleva a definir los siguientes campos nuevos en la API pública:

  • EXTRA_BCRADIO_FOLDER_TYPE = "android.media.extra.EXTRA_BCRADIO_FOLDER_TYPE". Uno de los siguientes valores:
    • BCRADIO_FOLDER_TYPE_PROGRAMS = 1. Son los 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 de la radio, ya que todos los datos relevantes se ajustan al esquema MediaBrowser.MediaItem existente:

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

    Por lo general, no es necesario recuperar la frecuencia de FM para una entrada en el programa actual o la lista de favoritos (ya que el cliente debe operar en IDs de contenido multimedia). Sin embargo, si surge tal necesidad (por ejemplo, con fines de visualización), está presente en el URI y se puede analizar en ProgramSelector. Dicho esto, no se recomienda usar el URI para seleccionar elementos dentro de la sesión actual. Para obtener más información, consulta ProgramSelector.

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

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

    Las 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 biblioteca de compatibilidad los tendrá diferentes). Los URIs (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 son en su mayoría los mismos entre los programas encontrados y los favoritos (excepto, por ejemplo, cuando se actualizó la AF).

    Tener diferentes mediaIds para entradas de diferentes tipos de listas permite realizar diferentes acciones en ellas. Puedes recorrer la lista de Favoritos o la lista de Todos los programas en onSkipToNext, según la carpeta de MediaItem seleccionada recientemente (consulta MediaSession).

    Acciones de sintonización especial

    La lista de programas permite a los usuarios sintonizar una estación específica, pero no les permite realizar solicitudes generales, como "Sintonizar FM", lo que podría provocar que se sintonizara una estación que se escuchó recientemente en la banda FM.

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

    Acción Sintoniza Cómo emitir
    Reproducir la radio Cualquier canal de radio startService(ACTION_PLAY_BROADCASTRADIO)

    O,

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

    La app determina qué programa sintonizar. Por lo general, es el canal que se sintonizó más recientemente de la lista determinada. Para obtener detalles sobre ACTION_PLAY_BROADCASTRADIO, consulta Intents de reproducción generales.

    Descubrimiento y conexión de servicios

    PackageManager puede encontrar directamente el árbol de radio de transmisión que entrega MediaBrowserService. Para ello, llama a resolveService con el intent ACTION_PLAY_BROADCASTRADIO (consulta Intents de reproducción generales) y la marca MATCH_SYSTEM_ONLY. Para encontrar todos los servicios que publican radio (puede haber más de uno, por ejemplo, AM/FM y satélite separados), usa queryIntentServices.

    El servicio resuelto también controla el intent de vinculación android.media.browse.MediaBrowserService. Esto se verifica con GTS.

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

    La app de Radio puede restringir los paquetes de clientes que se pueden conectar en una implementación de onGetRoot de su servicio. La app debe permitir que las apps del sistema se conecten sin incluirlas en la lista de entidades permitidas. Para obtener más información sobre las listas de entidades permitidas, consulta Cómo aceptar el paquete y la firma de la app del Asistente.

    Si la app específica de la fuente (por ejemplo, una app de radio) está instalada en un dispositivo sin compatibilidad con esa fuente, se anunciará como la que controla el intent ACTION_PLAY_BROADCASTRADIO, pero su árbol de MediaBrowser no contendrá etiquetas específicas de radio. Por lo tanto, un cliente que desee verificar si una fuente determinada está disponible en un dispositivo debe hacer lo siguiente:

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

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

    Nombres de las bandas

    La lista de bandas está representada por un conjunto de directorios de nivel superior con una etiqueta de tipo de carpeta establecida en BCRADIO_FOLDER_TYPE_BAND. Los títulos de sus MediaItem son cadenas localizadas que representan nombres de bandas. En la mayoría de los casos, será igual 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 agrega una etiqueta adicional para las carpetas de bandas, 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 de nombre de la banda. Sin embargo, si la banda está en la lista, debe tener una etiqueta configurada. La radio HD no enumera bandas separadas, ya que usa el mismo medio subyacente que la AM/FM.

    Intents de reproducción general

    Cada app dedicada a reproducir una fuente determinada (como una radio o un CD) debe controlar un intent de reproducción general para comenzar a reproducir contenido, posiblemente desde un estado inactivo (por ejemplo, después del inicio). Depende de la app cómo seleccionar el contenido que se reproducirá, pero, por lo general, es el programa de radio o la pista de CD que se reprodujo recientemente.Hay un intent independiente 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: Disco de datos óptico, como CD/DVD, pero no CD-DA (puede ser un CD de modo mixto)
    • android.car.intent.action.PLAY_AUX: Sin especificar qué puerto AUX
    • android.car.intent.action.PLAY_BLUETOOTH
    • android.car.intent.action.PLAY_USB: Sin especificar qué dispositivo USB
    • android.car.intent.action.PLAY_LOCAL: Almacenamiento de contenido multimedia local (memoria flash integrada)

    Se eligieron los intents para usarlos en el comando de reproducción general, ya que resuelven dos problemas a la vez: el comando de reproducción general en sí y el descubrimiento de servicios. El beneficio adicional de tener ese intent sería la posibilidad de ejecutar una acción tan simple sin abrir la sesión de MediaBrowser.

    El descubrimiento de servicios es, en realidad, el problema más importante que se resuelve con estos intents. De esta manera, el procedimiento para el descubrimiento de servicios es fácil y unívoco (consulta Descubrimiento y conexión de servicios).

    Para facilitar algunas implementaciones de clientes, existe una forma alternativa de emitir ese comando de reproducción (que también debe implementar la app de radio): emitir playFromMediaId con el rootId del nodo raíz (que se usa como mediaId). Si bien el nodo raíz no está diseñado para reproducirse, su rootId es una cadena arbitraria que se puede consumir como mediaId. Sin embargo, no se requiere que los clientes comprendan este matiz.

    ProgramSelector

    Si bien mediaId es suficiente para seleccionar un canal de 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 una frecuencia absoluta) para mantenerlo entre sesiones y dispositivos.

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

    • Es el identificador principal. Es un identificador único y estable para una estación de radio determinada que no cambia, pero que puede no ser suficiente para sintonizarla. Por ejemplo, el código PI de RDS, que se puede traducir al indicativo de estación en EE.UU.
    • Identificadores secundarios. Son identificadores adicionales útiles para sintonizar esa estación (por ejemplo, la frecuencia), lo que puede incluir identificadores de otras tecnologías de radio. Por ejemplo, una estación DAB puede tener un resguardo de transmisión analógica.

    Para permitir que ProgramSelector se ajuste a la solución basada en MediaBrowser o MediaSession, define un esquema de URI para serializarlo. El esquema 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 (?)) es opcional y se puede quitar para proporcionar un identificador estable para 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 espacio para la 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 formato de valor es un número decimal o hexadecimal (con el prefijo 0x).

    Todos los identificadores específicos del proveedor se representan con el prefijo VENDOR_. Por ejemplo, VENDOR_0 para VENDOR_START y VENDOR_1 para VENDOR_START más 1. Estos URI son específicos del hardware de radio en el que se generaron y no se pueden transferir entre dispositivos fabricados por diferentes OEMs.

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

    El diseño inicial usaba un solo dos puntos en lugar de la secuencia :// después de la parte del esquema. Sin embargo, android.net.Uri no admite el primero para referencias de URI jerárquicas absolutas.

    Otros tipos de fuentes

    Se puede controlar de manera similar otras fuentes de audio. Por ejemplo, la entrada auxiliar y el reproductor de CD de audio.

    Una sola app puede publicar varios tipos de fuentes. En esos casos, te recomendamos que crees un MediaBrowserService independiente para cada tipo de fuente. Incluso en una configuración con varias fuentes o MediaBrowserServices, se recomienda tener una sola MediaSession dentro de una sola app.

    CD de audio

    Es similar al audio CD en que la app que entrega esos discos expondría MediaBrowser con una sola entrada navegable (o más, si el sistema tiene un cambiador de CD), que a su vez contendría todas las pistas de un CD determinado. Si el sistema no tiene información sobre las pistas de cada CD (por ejemplo, cuando todos los discos 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 ranura determinada, el elemento no será PLAYABLE ni BROWSABLE (pero cada ranura siempre debe estar presente en el árbol).

     Estructura de árbol de un CD de audio
    Figura 3: Estructura de árbol de un CD de audio.

    Estas entradas se marcarían de manera similar a las carpetas de radio de transmisión. Contendrían campos adicionales definidos en la API de MediaDescription:

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

    Para un sistema compatible con CD-Text y un disco compatible, el MediaItem de nivel superior tendría el título del disco. Del mismo modo, los MediaItems de las pistas tendrían un título de la pista.

    Entrada auxiliar

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

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

    Cada entrada de MediaItem AUX tendría un campo extra EXTRA_AUX_PORT_NAME establecido en el nombre no localizado del puerto sin la frase “AUX”. Por ejemplo, “AUX 1” se establecería en “1”, “AUX front” en “front” y “AUX” en una cadena vacía. En las configuraciones regionales que no son en inglés, la etiqueta de nombre conservaría la misma cadena en inglés. Es poco probable que, como en EXTRA_BCRADIO_BAND_NAME_EN, los valores sean definidos por el OEM y no estén restringidos a una lista predefinida.

    Si el hardware puede detectar dispositivos conectados al puerto AUX, debe marcar MediaItem como PLAYABLE, solo si la entrada está conectada. El hardware debería enumerarse (pero no PLAYABLE) si no se conectó nada a este puerto. Si el hardware no tiene esa capacidad, MediaItem siempre debe establecerse 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 debe revisar los MediaItems de nivel superior para los elementos que tienen el campo adicional EXTRA_CD_DISK o EXTRA_AUX_PORT_NAME configurado.

    Ejemplos detallados

    En los siguientes ejemplos, se aborda la estructura de árbol de MediaBrowser para los tipos de fuentes que forman parte de este diseño.

    MediaBrowserService de radio de transmisión (controla ACTION_PLAY_BROADCASTRADIO):

    • Estaciones (navegables)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 (jugable): broadcastradio://program/RDS_PI/5678?AMFM_FREQUENCY=88100
      • URI de ABC 88.1 HD1 (jugable): broadcastradio://program/HD_STATION_ID_EXT/158241DEADBEEF?AMFM_FREQUENCY=88100&RDS_PI=5678
      • URI de ABC 88.1 HD2 (jugable): broadcastradio://program/HD_STATION_ID_EXT/158242DEADBEFE
      • 90.5 FM (reproducible) - FM sin RDSURI: broadcastradio://program/AMFM_FREQUENCY/90500
      • URI de 620 AM (reproducible): broadcastradio://program/AMFM_FREQUENCY/620
      • URI de BBC One (reproducible): broadcastradio://program/DAB_SID_EXT/1E24102?RDS_PI=1234
    • Favoritos (se pueden explorar y reproducir)EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_FAVORITES
      • URI de BBC One (reproducible): broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=101300
      • URI de BBC Two (no se puede reproducir): broadcastradio://program/RDS_PI/1300?AMFM_FREQUENCY=102100
    • AM (se puede explorar y reproducir): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="AM"
      • URI de 5:30 a.m. (jugable): broadcastradio://program/AMFM_FREQUENCY/530
      • URI de 540 a.m. (jugable): broadcastradio://program/AMFM_FREQUENCY/540
      • URI de 550 a.m. (jugable): broadcastradio://program/AMFM_FREQUENCY/550
    • FM (se puede explorar y reproducir): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="FM"
      • URI de FM 87.7 (reproducible): broadcastradio://program/AMFM_FREQUENCY/87700
      • URI de FM 87.9 (reproducible): broadcastradio://program/AMFM_FREQUENCY/87900
      • URI de 88.1 FM (reproducible): broadcastradio://program/AMFM_FREQUENCY/88100
    • DAB (reproducible): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="DAB"

    MediaBrowserService de CD de audio (controla ACTION_PLAY_AUDIOCD):

    • Disco 1 (reproducible) EXTRA_CD_DISK=1
    • Disco 2 (se puede explorar y reproducir) EXTRA_CD_DISK=2
      • Pista 1 (reproducible) EXTRA_CD_TRACK=1
      • Segmento 2 (reproducible) EXTRA_CD_TRACK=2
    • Mi CD de música (se puede explorar y reproducir) EXTRA_CD_DISK=3
      • Solo (jugable) EXTRA_CD_TRACK=1
      • Reise, Reise (jugable) EXTRA_CD_TRACK=2
    • Ranura 4 vacía (no se puede reproducir) EXTRA_CD_DISK=4

    AUX MediaBrowserService (controla ACTION_PLAY_AUX):

    • AUX frontal (reproducible) EXTRA_AUX_PORT_NAME="front"
    • AUX trasero (reproducible) EXTRA_AUX_PORT_NAME="rear"