Implementando Radio

La implementación del control de radio se basa en MediaSession y MediaBrowse , que permiten que las aplicaciones de medios y asistentes de voz controlen la radio. Para obtener más información, consulte Crear aplicaciones multimedia para automóviles en developer.android.com.

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

Conmutador de fuente de medios

Para proporcionar una transición fluida entre la radio y otras aplicaciones que se muestran en los medios, la biblioteca car-media-common contiene clases que deben integrarse en la aplicación de radio. MediaAppSelectorWidget se puede incluir en el XML de la aplicación de radio (el icono y el menú desplegable utilizados en las aplicaciones de radio y medios 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 medios a las que se puede cambiar. Si se desea una interfaz de usuario distinta a la proporcionada, puede crear un widget personalizado para iniciar AppSelectionFragment cuando se deba mostrar el conmutador.

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

Se proporciona una implementación de muestra en la implementación de la aplicación de radio de referencia, ubicada en packages/apps/Car/Radio .

Especificaciones de control detalladas

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

  • onPlay , onStop . (Des) silenciar la reproducción de radio.
  • onPause . Pausa en diferido (si se admite).
  • onPlayFromMediaId . Reproduce cualquier contenido de una carpeta de nivel superior. Por ejemplo, "Reproducir FM" o "Reproducir radio".
  • onPlayFromUri . Reproduce una frecuencia específica. Por ejemplo, "Reproducir 88.5 FM".
  • onSkipToNext , onSkipToPrevious . Sintonice una estación anterior o siguiente.
  • onSetRating . Agregar o quitar a o de Favoritos.

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

  • ( Opcional ) Programas (estaciones). Este modo lo suelen utilizar las radios de doble sintonizador 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, algunos pueden no estar 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 y así sucesivamente). Cada banda tiene un directorio de nivel superior separado.
Estructura de árbol de MediaBrowserService
Figura 1. Estructura de árbol de MediaBrowserService

Cada elemento en cada una de estas carpetas (AM/FM/Programas) es un elemento multimedia con un URI que se puede usar con MediaSession para sintonizar. Cada carpeta de nivel superior (AM/FM/Programas) 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, "Reproducir FM", "Reproducir AM" y "Reproducir radio" son consultas de radio no específicas que usan un ID de medio para enviar a la aplicación de radio OEM. Depende de la aplicación de radio determinar qué reproducir desde la solicitud genérica y el ID de medios.

MediaSession

Dado que no existe el concepto de pausar una transmisión, las acciones Reproducir, Pausa y Detener no siempre se aplican a la radio. Con la radio, la acción Detener está asociada con silenciar la transmisión, mientras que Reproducir está asociada con eliminar el silenciamiento.

Algunos sintonizadores de radio (o aplicaciones) brindan la capacidad de simular una pausa en la transmisión al almacenar contenido en caché y luego reproducirlo más tarde. En tales casos, use onPause .

Reproducir desde las acciones mediaId y URI está destinado a sintonizar una estación obtenida desde la interfaz de MediaBrowser. El mediaId es una cadena arbitraria proporcionada por la aplicación de radio para imponer un valor único (por lo que una identificación determinada apunta a un solo elemento) y estable (por lo que un elemento determinado tiene la misma identificación durante toda la sesión) con el que identificar una estación determinada . El URI será de un esquema bien definido. En resumen, una forma URI de ProgramSelector. Si bien esto preserva el atributo de unicidad, no necesita ser estable, aunque puede cambiar cuando la estación se mueve a una frecuencia diferente.

Por diseño, onPlayFromSearch no se usa. Es responsabilidad del cliente (aplicación complementaria) seleccionar un resultado de búsqueda del árbol de MediaBrowser. Transferir esa responsabilidad a la aplicación de radio aumentaría la complejidad, requeriría contratos formales sobre cómo deberían aparecer las consultas de cadenas y daría como resultado una experiencia de usuario desigual en diferentes plataformas de hardware.

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

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

  • Cuando una aplicación se sintoniza en una estación de la lista de Favoritos, la aplicación puede pasar a la siguiente estación de la lista de Favoritos.
  • Escuchar una estación de la lista de programas puede resultar en la sintonización de la próxima estación disponible, ordenada según el número de canal.
  • Escuchar un canal arbitrario puede resultar en sintonizar el siguiente canal físico, incluso cuando no hay señal de transmisión.

La aplicación de radio maneja estas acciones.

Manejo de errores

Las acciones TransportControls (Reproducir, Detener y Siguiente) no proporcionan información sobre si la acción se realizó 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 aplicación de radio debe manejar 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 caso de sintonización directa) o STATE_SKIPPING_TO_PREVIOUS / NEXT mientras se ejecuta el comando.

El cliente debe ver PlaybackState y verificar que la sesión cambió el programa actual a lo que se solicitó o entró en estado de error. STATE_CONNECTING no debe exceder los 30 s. Sin embargo, una sintonización directa a una frecuencia AM/FM dada debería funcionar mucho más rápido.

Adición y eliminación de favoritos

MediaSession tiene soporte de calificación, que se puede usar para controlar los Favoritos. onSetRating llamado con una calificación de tipo RATING_HEART agrega o elimina la estación sintonizada actualmente ao de la lista de Favoritos.

A diferencia de los ajustes preestablecidos heredados, este modelo asume una lista de favoritos desordenada e ilimitada, cuando cada favorito guardado se asigna a una ranura numérica (normalmente, del 1 al 6). Como resultado, los sistemas basados ​​en preajustes serían incompatibles con la operación onSetRating .

La limitación de la API de MediaSession es que solo se puede agregar o eliminar la estación sintonizada actualmente. Por ejemplo, los elementos deben seleccionarse primero antes de que puedan eliminarse. Esta es solo una limitación del cliente MediaBrowser, como una aplicación complementaria. La aplicación de radio no está restringida de manera similar. Esta parte es opcional cuando una aplicación no admite Favoritos.

Explorador de medios

Para expresar qué frecuencias o nombres de canales físicos (cuando sintonizar un canal arbitrario es adecuado para una tecnología de radio determinada) son válidos para 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 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 1700 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 actualmente disponibles es plana en el sentido de que esto no permite esquemas de visualización como la agrupación por conjunto de transmisión directa de audio (DAB).

Es posible que las entradas de la lista de favoritos no se puedan sintonizar. Por ejemplo, si un programa dado está fuera de rango. La aplicación de radio puede o no detectar si la entrada se puede sintonizar de antemano. Si es así, es posible que no marque la entrada como jugable.

Para identificar las carpetas de nivel superior, se aplica el mismo mecanismo que utiliza Bluetooth. Es decir, un paquete Extras del objeto MediaDescription contiene un campo específico del sintonizador tal como lo hace Bluetooth con EXTRA_BT_FOLDER_TYPE . En el caso de la radiodifusión, esto lleva a definir los siguientes nuevos campos 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 . Programas disponibles actualmente.
    • BCRADIO_FOLDER_TYPE_FAVORITES = 2 . Favoritos.
    • BCRADIO_FOLDER_TYPE_BAND = 3 . Todos los canales físicos para una banda determinada.

    No es necesario definir ningún campo de metadatos personalizado específico de radio, ya que todos los datos relevantes se ajustan al esquema MediaBrowser.MediaItem existente:

    • Nombre del programa (RDS PS, nombre del servicio DAB). MediaDescription.getTitle .
    • frecuencia FM. URI (ver ProgramSelector ) o MediaDescription.getTitle (si una entrada está 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 buscar la frecuencia FM para una entrada en el programa actual o en la lista de favoritos (ya que el cliente debe operar con ID de medios). Sin embargo, si surgiera 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 utilizar el URI para seleccionar elementos dentro de la sesión actual. Para obtener más información, consulte Selector de programas.

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

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

    Las entradas relacionadas de todos los tipos de listas (canales sin procesar, programas encontrados y favoritos) pueden tener ID de medios diferentes (depende de la aplicación de radio; la biblioteca de soporte los tendrá diferentes). Los URI (en forma de ProgramSelector) serán diferentes entre los canales sin procesar y los programas encontrados en la mayoría de los casos (excepto FM sin RDS); pero casi lo mismo entre los programas encontrados y los favoritos (excepto, por ejemplo, cuando se actualizó AF).

    Tener diferentes mediaIds para entradas de diferentes tipos de listas hace posible realizar diferentes acciones en ellas. Puede recorrer la lista de Favoritos o la lista de Todos los programas en onSkipToNext , según la carpeta del MediaItem seleccionado recientemente (consulte MediaSession ).

    Acciones especiales de melodía

    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 resultar en sintonizar una estación escuchada recientemente en la banda FM.

    Para admitir tales acciones, algunos directorios de nivel superior tienen establecido el indicador FLAG_PLAYABLE (junto con FLAG_BROWSABLE para carpetas).

    Acción Sintoniza a como emitir
    reproducir radio Cualquier canal de radio startService(ACTION_PLAY_BROADCASTRADIO)
    o playFromMediaId(MediaBrowser. getRoot() )
    Reproducir FM Cualquier canal FM Reproducir desde mediaId de banda FM

    La determinación de qué programa sintonizar depende de la aplicación. Este suele ser el canal sintonizado más recientemente de la lista dada. Para obtener detalles sobre ACTION_PLAY_BROADCASTRADIO , consulte las intenciones generales de reproducción .

    Descubrimiento y conexión de servicios

    PackageManager puede encontrar directamente el árbol de transmisión de radio MediaBrowserService. Para hacerlo, llame a resolveService con la intención ACTION_PLAY_BROADCASTRADIO (consulte Intentos generales de reproducción ) y el indicador MATCH_SYSTEM_ONLY . Para encontrar todos los servicios que prestan servicios de radio (puede haber más de uno, por ejemplo, AM/FM y satélite separados), use queryIntentServices .

    El servicio resuelto también controlará la intención de vinculación de android.media.browse.MediaBrowserService . Esto se verifica con GTS.

    Para conectarse al MediaBrowserService seleccionado, cree 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 getSessionToken .

    La aplicación Radio puede restringir los paquetes de clientes que pueden conectarse en una implementación onGetRoot de su servicio. La aplicación debe permitir que las aplicaciones del sistema se conecten sin incluirlas en la lista blanca. Para obtener detalles sobre la inclusión en la lista blanca, consulte Aceptar el paquete y la firma de la aplicación Assistant .

    Si la aplicación específica de la fuente (por ejemplo, una aplicación de radio) se instala en un dispositivo sin dicha compatibilidad con la fuente, se anunciaría a sí misma como responsable de la intención ACTION_PLAY_BROADCASTRADIO , pero su árbol MediaBrowser no contendría etiquetas específicas de la radio. Por lo tanto, un cliente que desee verificar si una fuente determinada está disponible en un dispositivo debe:

    1. Descubra el servicio de radio (llame a resolveService para ACTION_PLAY_BROADCASTRADIO ).
    2. Cree MediaBrowser para él y luego conéctese a él.
    3. Determine la presencia de MediaItem con EXTRA_BCRADIO_FOLDER_TYPE extra.

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

    Nombres de 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á 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 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 tomar uno de estos valores predefinidos:

    • AM
    • FM
    • DAB
    • SXM

    Si la banda no está en esta lista, la etiqueta de nombre de la banda no debe configurarse. Sin embargo, si la banda está en la lista, debe tener una etiqueta establecida. La radio HD no tiene bandas separadas enumeradas ya que utiliza el mismo medio subyacente que AM/FM.

    Intenciones generales de juego

    Cada aplicación dedicada a reproducir una fuente dada (como radio o CD) debe manejar una intención de reproducción general, para comenzar a reproducir algún contenido posiblemente desde un estado inactivo (por ejemplo, después del arranque). Depende de la aplicación cómo seleccionar el contenido para reproducir, pero generalmente es el programa de radio o la pista de CD que se reprodujo recientemente.
    Hay una intención separada definida 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 ópticos 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 multimedia local (flash incorporado)

    Se eligieron las intenciones para usarlas en el comando de reproducción general, porque resuelven dos problemas a la vez: el comando de reproducción general en sí mismo y el descubrimiento del servicio. El beneficio adicional de tener tal intención 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 resuelto con estos intentos. El procedimiento para el descubrimiento de servicios es fácil e inequívoco de esta manera (ver Descubrimiento y conexión de servicios ).

    Para facilitar algunas implementaciones de clientes, existe una forma alternativa de emitir dicho comando de reproducción (que también debe implementar la aplicación de radio): emitir playFromMediaId con el rootId del nodo raíz (utilizado como mediaId). Si bien el nodo raíz no está destinado a ser reproducible, su rootId es una cadena arbitraria que se puede convertir en consumible como mediaId. Sin embargo, los clientes no están obligados a comprender este matiz.

    Selector de programa

    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, el cliente puede necesitar un puntero absoluto (como una frecuencia absoluta) para mantenerlo entre sesiones y dispositivos.

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

    • Identificador principal. Un identificador único y estable para una estación de radio determinada que no cambia pero que puede no ser suficiente para sintonizar esa estación. Por ejemplo, el código PI RDS, que puede traducirse al distintivo de llamada en los EE. UU.
    • Identificadores secundarios. Identificadores adicionales útiles para sintonizar esa estación (por ejemplo, frecuencia), posiblemente incluyendo identificadores de otras tecnologías de radio. Por ejemplo, una estación DAB puede tener un respaldo de transmisión analógica.

    Para permitir que ProgramSelector encaje en la solución basada en MediaBrowser/MediaSession, defina 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 los identificadores secundarios (después del signo de interrogación ( ? )) es opcional y se puede eliminar 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) del program proporciona cierto 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 HAL 2.x de IdentifierType y el formato del valor es un número decimal o hexadecimal (con el prefijo 0x ).

    Todos los identificadores específicos del proveedor están representados por el prefijo VENDOR_ . Por ejemplo, VENDOR_0 para VENDOR_START y VENDOR_1 para VENDOR_START + 1 . Dichos URI son específicos del hardware de radio en el que se generaron y no se pueden transferir entre dispositivos fabricados por diferentes OEM.

    Estos URI deben asignarse a cada elemento multimedia en las carpetas de radio de nivel superior. Además, MediaSession debe admitir tanto playFromMediaId como playFromUri . Sin embargo, el URI está diseñado principalmente para 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 tipo de ID principal aún no es compatible con el marco). Por otro lado, Media ID siempre funciona. No se recomienda que los clientes utilicen URI para seleccionar elementos de la sesión actual de MediaBrowser. En su lugar, usa playFromMediaId . Dicho esto, no es opcional para la aplicación de servicio y los URI faltantes se reservan para casos bien justificados.

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

    Otros tipos de fuentes

    Otras fuentes de audio se pueden manejar de manera similar. Por ejemplo, la entrada auxiliar y el reproductor de CD de audio.

    Una sola aplicación puede servir para múltiples tipos de fuentes. En tales casos, se recomienda que cree un MediaBrowserService independiente para cada tipo de fuente. Incluso en una configuración con múltiples fuentes servidas/MediaBrowserServices, se recomienda enfáticamente tener una sola MediaSession dentro de una sola aplicación.

    CD de audio

    Similar al CD de audio en el sentido de que la aplicación que sirve a dichos 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 conoce las pistas de cada CD (por ejemplo, cuando se insertan todos los discos en un cartucho a la vez y no los lee todos), MediaItem para todo el disco sería simplemente PLAYABLE , no BROWSABLE+PLAYABLE . Si no hay ningún disco en una ranura determinada, el elemento no se podrá PLAYABLE ni BROWSABLE (pero cada ranura debe estar siempre presente en el árbol).

    Estructura de árbol de CD de audio
    Figura 2. Estructura de árbol de CD de audio

    Estas entradas se marcarían de manera similar a las carpetas de radiodifusión: contendrían campos adicionales adicionales definidos en la API MediaDescription:

    • EXTRA_CD_TRACK : para cada MediaItem en CD de audio, número de pista basado en 1.
    • EXTRA_CD_DISK : número de disco basado en 1.

    Para un sistema habilitado para CD-Text y un disco compatible, el MediaItem de nivel superior tendría un título del disco. De manera similar, los MediaItems para pistas tendrían un título de la pista.

    Entrada auxiliar

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

    Estructura de árbol auxiliar
    Figura 3. Estructura de árbol AUX

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

    Si el hardware puede detectar dispositivos conectados al puerto AUX, el hardware debe marcar el MediaItem como PLAYABLE , solo si la entrada está conectada. El hardware aún debe 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

    Por lo tanto, se deben definir las siguientes claves adicionales:

    • 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 en busca de elementos que tengan configurado el campo adicional EXTRA_CD_DISK o EXTRA_AUX_PORT_NAME .

    Ejemplos detallados

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

    Broadcast radio MediaBrowserService (maneja ACTION_PLAY_BROADCASTRADIO ):

    • Estaciones (navegables)
      EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_PROGRAMS
      • BBC One (jugable)
        URI: broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=90500
      • ABC 88.1 (jugable)
        URI: broadcastradio://program/RDS_PI/5678?AMFM_FREQUENCY=88100
      • ABC 88.1 HD1 (jugable)
        URI: broadcastradio://program/HD_STATION_ID_EXT/158241DEADBEEF?AMFM_FREQUENCY=88100&RDS_PI=5678
      • ABC 88.1 HD2 (jugable)
        URI: broadcastradio://program/HD_STATION_ID_EXT/158242DEADBEFE
      • 90.5 FM (reproducible) – FM sin RDS
        URI: broadcastradio://program/AMFM_FREQUENCY/90500
      • 620 AM (jugable)
        URI: broadcastradio://program/AMFM_FREQUENCY/620
      • BBC One (jugable)
        URI: broadcastradio://program/DAB_SID_EXT/1E24102?RDS_PI=1234
    • Favoritos (navegables, jugables)
      EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_FAVORITES
      • BBC One (jugable)
        URI: broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=101300
      • BBC Two (no jugable)
        URI: broadcastradio://program/RDS_PI/1300?AMFM_FREQUENCY=102100
    • AM (navegable, jugable)
      EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BAND
      EXTRA_BCRADIO_BAND_NAME_EN="AM"
      • 530 AM (jugable)
        URI: broadcastradio://program/AMFM_FREQUENCY/530
      • 540 AM (jugable)
        URI: broadcastradio://program/AMFM_FREQUENCY/540
      • 550 AM (jugable)
        URI: broadcastradio://program/AMFM_FREQUENCY/550
    • FM (navegable, reproducible)
      EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BAND
      EXTRA_BCRADIO_BAND_NAME_EN="FM"
      • 87.7 FM (jugable)
        URI: broadcastradio://program/AMFM_FREQUENCY/87700
      • 87.9 FM (jugable)
        URI: broadcastradio://program/AMFM_FREQUENCY/87900
      • 88.1 FM (jugable)
        URI: broadcastradio://program/AMFM_FREQUENCY/88100
    • DAB (jugable)
      EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BAND
      EXTRA_BCRADIO_BAND_NAME_EN="DAB"

    CD de audio MediaBrowserService (maneja ACTION_PLAY_AUDIOCD ):

    • Disco 1 (reproducible)
      EXTRA_CD_DISK=1
    • Disco 2 (explorable, reproducible)
      EXTRA_CD_DISK=2
      • Pista 1 (reproducible)
        EXTRA_CD_TRACK=1
      • Pista 2 (jugable)
        EXTRA_CD_TRACK=2
    • Mi CD de música (explorable, reproducible)
      EXTRA_CD_DISK=3
      • Todo por mí mismo (jugable)
        EXTRA_CD_TRACK=1
      • Reise, Reise (jugable)
        EXTRA_CD_TRACK=2
    • Espacio vacío 4 (no jugable)
      EXTRA_CD_DISK=4

    AUX MediaBrowserService (maneja ACTION_PLAY_AUX ):

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