Implementação de controles de rádio

A implementação do controle de rádio é baseada em MediaSession e MediaBrowse, que permitem que apps de mídia e assistentes de voz controlem o rádio. Para mais informações, consulte Criar apps de mídia para carros em developer.android.com.

Uma implementação de árvore de navegação de mídia é fornecida na biblioteca car-broadcastradio-support em packages/apps/Car/libs. Essa biblioteca também contém extensões de ProgramSelector para converter para e de URI. Recomendamos que as implementações de rádio usem essa biblioteca para criar a árvore de navegação associada.

Seletor de origem de mídia

Para oferecer uma transição perfeita entre o rádio e outros apps exibidos na mídia, a biblioteca car-media-common contém classes que precisam ser integradas ao app de rádio. MediaAppSelectorWidgetpode ser incluído no XML do app de rádio (o ícone e o menu suspenso usados nos apps de mídia e rádio de referência):

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

Esse widget inicia o AppSelectionFragment, que mostra uma lista de fontes de mídia para as quais é possível alternar. Se você quiser usar uma interface diferente da fornecida, crie um widget personalizado para iniciar o AppSelectionFragment quando o seletor for exibido.

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

Uma implementação de exemplo é fornecida na implementação de referência do app de rádio, localizada em packages/apps/Car/Radio.

Especificações detalhadas de controle

A interface MediaSession (através de MediaSession.Callback) fornece mecanismos de controle para o programa de rádio que está sendo tocado:

  • onPlay, onStop. Ativar ou desativar o som da reprodução de rádio.
  • onPause. Pausa com time-shifting (se houver suporte).
  • onPlayFromMediaId. Reproduza qualquer conteúdo de uma pasta de nível superior. Por exemplo, "Toque a FM" ou "Toque a Rádio".
  • onPlayFromUri. Toca uma frequência específica. Por exemplo, "Tocar 88.5 FM".
  • onSkipToNext, onSkipToPrevious. Sintonize a próxima ou a estação anterior.
  • onSetRating. Adicione ou remova dos favoritos.

O MediaBrowser expõe um MediaItem sintonizável em três tipos de diretórios de nível superior:

  • (Opcional) Programas (estações). Esse modo é normalmente usado por rádios de sintonizador duplo para indicar todas as estações de rádio sintonizáveis disponíveis no local do usuário.
  • Favoritos. Programas de rádio adicionados à lista de favoritos. Alguns podem estar indisponíveis (fora do alcance de recepção).
  • Canais de banda. Todos os canais fisicamente possíveis na região atual (87,9, 88.1, 88.3, 88.5, 88.7, 88.9, 89.1 e assim por diante). Cada banda tem um diretório de nível superior separado.
Estrutura de árvore do MediaBrowserService
Figura 2. Estrutura em árvore do MediaBrowserService

Cada elemento em cada uma dessas pastas (AM/FM/Programs) é um MediaItem com um URI que pode ser usado com MediaSession para sintonizar. Cada pasta de nível superior (AM/FM/Programas) é um MediaItem com um mediaId que pode ser usado com MediaSession para acionar a reprodução e fica a critério do OEM. Por exemplo, "Play FM", "Play AM" e "Play Radio" são consultas de rádio não específicas que usam um mediaId para enviar ao app de rádio OEM. Cabe ao app de rádio determinar o que será tocado na solicitação genérica e no mediaId.

MediaSession

Como não há conceito de pausar um stream de transmissão, as ações "Tocar", "Pausar" e "Parar" nem sempre se aplicam ao rádio. Com o rádio, a ação "Parar" é associada ao silenciamento do fluxo, enquanto "Tocar" é associada à remoção do silenciamento.

Alguns sintonizadores de rádio (ou apps) permitem simular uma pausa do fluxo de transmissão armazenando o conteúdo em cache e reproduzindo-o mais tarde. Nesses casos, use onPause.

A reprodução de ações de mediaId e URI é destinada a sintonizar uma estação extraída da interface MediaBrowser. O mediaId é uma string arbitrária fornecida pelo app de rádio para impor um valor exclusivo (para que um determinado ID aponte para apenas um item) e estável (para que um determinado item tenha o mesmo ID durante toda a sessão) para identificar uma determinada estação. O URI terá um esquema bem definido. Em resumo, uma forma URI de ProgramSelector. Embora isso preserve o atributo de unicidade, ele não precisa ser estável, embora possa mudar quando a estação muda para uma frequência diferente.

Por padrão, onPlayFromSearch não é usado. É responsabilidade do cliente (app complementar) selecionar um resultado da pesquisa na árvore do MediaBrowser. Transferir essa responsabilidade para o app de rádio aumentaria a complexidade, exigiria contratos formais sobre como as consultas de string seriam exibidas e resultaria em uma experiência do usuário desigual em diferentes plataformas de hardware.

Observação:o app de rádio não contém informações adicionais que seriam úteis para pesquisar o nome de uma estação que não está exposto ao cliente pela interface MediaBrowser.

A ida para a próxima ou a estação anterior depende do contexto atual:

  • Quando um app é sintonizado em uma estação da lista de favoritos, ele pode mudar para a próxima estação da lista de favoritos.
  • Ouvir uma estação da lista de programas pode resultar na sintonização da próxima estação disponível, classificada de acordo com o número do canal.
  • A escuta de um canal arbitrário pode resultar na sintonização do próximo canal físico, mesmo quando não há um sinal de transmissão.

O app de rádio processa essas ações.

Tratamento de erros

As ações TransportControls (reproduzir, parar e avançar) não fornecem feedback sobre se a ação foi bem-sucedida ou não. A única maneira de indicar um erro é definir o estado da MediaSession como STATE_ERROR com uma mensagem de erro.

O app de rádio precisa processar essas ações e executá-las ou definir um estado de erro. Se a execução do comando "Play" não for imediata, o estado de reprodução precisa ser alterado para STATE_CONNECTING (no caso de ajuste direto) ou STATE_SKIPPING_TO_PREVIOUS ou NEXT enquanto o comando está sendo executado.

O cliente precisa observar o PlaybackState e verificar se a sessão mudou o programa atual para o que foi solicitado ou entrou no estado de erro. STATE_CONNECTING não pode exceder 30 segundos. No entanto, uma sintonização direta para uma determinada frequência AM/FM deve ser muito mais rápida.

Adicionar e remover favoritos

O MediaSession tem suporte a classificação, que pode ser usado para controlar os favoritos. onSetRating chamado com uma classificação do tipo RATING_HEART adiciona ou remove a estação sintonizada atualmente da lista de favoritos.

Ao contrário das predefinições legados, esse modelo assume uma lista de favoritos não ordenada e ilimitada, quando cada favorito salvo é alocado em um slot numérico (normalmente, 1 a 6). Como resultado, os sistemas baseados em predefinições seriam incompatíveis com a operação onSetRating.

A limitação da API MediaSession é que apenas a estação sintonizada no momento pode ser adicionada ou removida. Por exemplo, os itens precisam ser selecionados antes de serem removidos. Essa é apenas uma limitação do cliente do MediaBrowser, como um app complementar. O app de rádio não tem essa restrição. Essa parte é opcional quando um app não oferece suporte a favoritos.

MediaBrowser

Para expressar quais frequências ou nomes de canais físicos (quando a sintonia para um canal arbitrário é adequada para uma determinada tecnologia de rádio) são válidos para uma determinada região, todos os canais válidos (frequências) são listados para cada banda. Na região dos EUA, isso equivale a 101 canais FM no intervalo de 87,8 a 108,0 MHz (usando espaçamento de 0,2 MHz) e 117 canais AM no intervalo de 530 a 1700 kHz (usando espaçamento de 10 kHz). Como o rádio HD usa o mesmo espaço de canal, ele não é apresentado separadamente.

A lista de programas de rádio disponíveis no momento é plana, o que não permite esquemas de exibição, como agrupamento por transmissão de áudio direta (DAB, na sigla em inglês).

As entradas na lista de favoritos podem não ser configuráveis. Por exemplo, se um determinado programa estiver fora do intervalo. O app de rádio pode ou não detectar se a entrada pode ser sintonizada com antecedência. Se esse for o caso, a entrada pode não ser marcada como jogável.

Para identificar pastas de nível superior, o mesmo mecanismo usado pelo Bluetooth é aplicado. Ou seja, um pacote de extras do objeto MediaDescription contém um campo específico do sintonizador, assim como o Bluetooth faz com EXTRA_BT_FOLDER_TYPE. No caso de transmissão de rádio, isso leva à definição dos seguintes novos campos na API pública:

  • EXTRA_BCRADIO_FOLDER_TYPE = "android.media.extra.EXTRA_BCRADIO_FOLDER_TYPE". Um dos seguintes valores:
    • BCRADIO_FOLDER_TYPE_PROGRAMS = 1. Programas disponíveis no momento.
    • BCRADIO_FOLDER_TYPE_FAVORITES = 2. Favoritos.
    • BCRADIO_FOLDER_TYPE_BAND = 3: todos os canais físicos de uma determinada banda.

    Não é necessário definir campos de metadados personalizados específicos do botão de rádio, porque todos os dados relevantes se encaixam no esquema MediaBrowser.MediaItem atual:

    • Nome do programa (RDS PS, DAB service name). MediaDescription.getTitle.
    • Frequência FM. URI (consulte ProgramSelector) ou MediaDescription.getTitle (se uma entrada estiver na pasta BROADCASTRADIO_FOLDER_TYPE_BAND).
    • Identificadores específicos de rádio (RDS PI, DAB SId). MediaDescription.getMediaUri analisado para ProgramSelector.

    Normalmente, não é necessário buscar a frequência FM para uma entrada no programa atual ou na lista de favoritos, já que o cliente precisa operar em IDs de mídia. No entanto, se essa necessidade surgir (por exemplo, para fins de exibição), ela estará presente no URI e poderá ser analisada como ProgramSelector. No entanto, não é recomendável usar o URI para selecionar itens na sessão atual. Para mais detalhes, consulte ProgramSelector.

    Para evitar problemas de desempenho ou relacionados ao Binder, o serviço MediaBrowser precisa oferecer suporte à paginação:

    Observação:por padrão, a paginação é implementada na variante onLoadChildren() sem processamento de opções.

    As entradas relacionadas de todos os tipos de listas (canais brutos, programas encontrados e favoritos) podem ter mediaIds diferentes. Isso depende do app de rádio. A biblioteca de suporte vai ter valores diferentes. Os URIs (no formulário ProgramSelector) diferem entre canais brutos e programas encontrados na maioria dos casos (exceto FM sem RDS), mas são praticamente os mesmos entre programas encontrados e favoritos (exceto, por exemplo, quando o AF foi atualizado).

    Ter mediaIds diferentes para entradas de diferentes tipos de listas permite realizar ações diferentes nelas. É possível percorrer a lista de favoritos ou a lista "Todos os programas" em onSkipToNext, dependendo da pasta de MediaItem selecionada recentemente (consulte MediaSession).

    Ações de ajuste especial

    A lista de programas permite que os usuários sintonizem uma estação específica, mas não permite que eles façam solicitações gerais, como "Sintonize o FM", que pode resultar na sintonização de uma estação ouvida recentemente na faixa FM.

    Para oferecer suporte a essas ações, alguns diretórios de nível superior têm a flag FLAG_PLAYABLE definida (junto com FLAG_BROWSABLE para pastas).

    Ação Sintoniza para Como emitir
    Ouvir o rádio Qualquer canal de rádio startService(ACTION_PLAY_BROADCASTRADIO)

    OU,

    playFromMediaId(MediaBrowser.getRoot())
    Play FM Qualquer canal de FM Tocar na mediaId da faixa FM.

    A determinação de qual programa sintonizar é de responsabilidade do app. Isso geralmente é o canal sintonizado mais recentemente da lista. Para saber mais sobre ACTION_PLAY_BROADCASTRADIO, consulte Intents de reprodução gerais.

    Descoberta e conexão de serviços

    PackageManager pode encontrar diretamente a árvore de rádio de transmissão do MediaBrowserService. Para fazer isso, chame resolveService com a intent ACTION_PLAY_BROADCASTRADIO (consulte Intents gerais de reprodução) e a flag MATCH_SYSTEM_ONLY. Para encontrar todos os serviços que veiculam rádio (pode haver mais de um, por exemplo, AM/FM e satélite separados), use queryIntentServices.

    O serviço resolvido também processa a intent de vinculação android.media.browse.MediaBrowserService. Isso é verificado com o GTS.

    Para se conectar ao MediaBrowserService selecionado, crie uma instância MediaBrowser para um determinado componente de serviço e connect. Depois de estabelecer a conexão, um identificador para MediaSession pode ser obtido por getSessionToken.

    O app de rádio pode restringir os pacotes de cliente permitidos a se conectar em uma implementação onGetRoot do serviço. O app precisa permitir que os apps do sistema se conectem sem a lista de permissões. Para saber mais sobre a inclusão na lista de permissões, consulte Aceitar o pacote e a assinatura do app do Google Assistente.

    Se o app específico da fonte (por exemplo, um app de rádio) estiver instalado em um dispositivo sem esse suporte, ele ainda vai se anunciar como o que processa a intent ACTION_PLAY_BROADCASTRADIO, mas a árvore do MediaBrowser não vai conter tags específicas de rádio. Portanto, um cliente que queira verificar se uma determinada fonte está disponível em um dispositivo precisa:

    1. Descubra o serviço de rádio (chame resolveService para ACTION_PLAY_BROADCASTRADIO).
    2. Crie e se conecte ao MediaBrowser.
    3. Determine a presença de MediaItem com EXTRA_BCRADIO_FOLDER_TYPE extra.

    Observação : na maioria dos casos, o cliente precisa verificar todas as árvores do MediaBrowser disponíveis para detectar todas as fontes disponíveis de um determinado dispositivo.

    Nomes de bandas

    A lista de bandas é representada por um conjunto de diretórios de nível superior com uma tag de tipo de pasta definida como BCRADIO_FOLDER_TYPE_BAND. Os títulos de MediaItem são strings localizadas que representam os nomes das bandas. Na maioria dos casos, será o mesmo que a tradução para o inglês, mas o cliente não pode depender dessa suposição.

    Para fornecer um mecanismo estável de pesquisa de determinadas bandas, uma tag extra foi adicionada para pastas de bandas, EXTRA_BCRADIO_BAND_NAME_EN. Esse é um nome não localizado da banda e só pode ter um destes valores predefinidos:

    • AM
    • FM
    • DAB

    Se a banda não estiver na lista, a tag de nome da banda não será definida. No entanto, se a banda estiver na lista, ela precisa ter uma tag definida. O rádio HD não enumera bandas separadas, porque usa o mesmo meio subjacente que AM/FM.

    Intents de reprodução gerais

    Cada app dedicado à reprodução de uma determinada fonte (como rádio ou CD) precisa processar uma intent play geral para começar a reproduzir algum conteúdo, possivelmente a partir do estado inativo (por exemplo, após a inicialização). Cabe ao app selecionar o conteúdo a ser reproduzido, mas geralmente é o programa de rádio ou a faixa de CD tocada recentemente.Há uma intent separada definida para cada fonte de áudio:

    • android.car.intent.action.PLAY_BROADCASTRADIO
    • android.car.intent.action.PLAY_AUDIOCD: CD-DA ou CD-Text
    • android.car.intent.action.PLAY_DATADISC: disco de dados óptico, como CD/DVD, mas não CD-DA (pode ser um CD de modo misto)
    • android.car.intent.action.PLAY_AUX: sem especificar qual porta AUX
    • android.car.intent.action.PLAY_BLUETOOTH
    • android.car.intent.action.PLAY_USB: sem especificar qual dispositivo USB
    • android.car.intent.action.PLAY_LOCAL: armazenamento de mídia local (flash integrado)

    As intents foram escolhidas para serem usadas no comando de reprodução geral porque resolvem dois problemas de uma vez: o comando de reprodução geral e a descoberta de serviços. Outro benefício de ter essa intent é a possibilidade de executar essa ação simples sem abrir a sessão do MediaBrowser.

    A descoberta de serviços é o problema mais importante resolvido com essas intents. O procedimento para descoberta de serviços é fácil e inequívoco dessa forma (consulte Descoberta e conexão de serviço).

    Para facilitar algumas implementações de cliente, há uma maneira alternativa de emitir esse comando de reprodução (que também precisa ser implementado pelo app de rádio): emitindo playFromMediaId com o rootId do nó raiz (usado como mediaId). Embora o nó raiz não seja destinado a ser reproduzido, o rootId dele é uma string arbitrária que pode ser consumida como mediaId. No entanto, os clientes não precisam entender essa nuance.

    ProgramSelector

    Embora mediaId seja suficiente para selecionar um canal no MediaBrowserService, ele fica vinculado a uma sessão e não é consistente entre os provedores. Em alguns casos, o cliente pode precisar de um ponteiro absoluto (como uma frequência absoluta) para mantê-lo entre sessões e dispositivos.

    Na era das transmissões de rádio digitais, uma frequência simples não é suficiente para sintonizar uma estação específica. Portanto, use ProgramSelector para sintonizar um canal analógico ou digital. O ProgramSelector consiste em duas partes:

    • Identificador principal. Um identificador exclusivo e estável de uma determinada estação de rádio que não muda, mas pode não ser suficiente para sintonizar essa estação. Por exemplo, o código RDS PI, que pode ser traduzido para o indicativo de chamada nos EUA.
    • Identificadores secundários. Outros identificadores úteis para sintonizar a estação (por exemplo, frequência), possivelmente incluindo identificadores de outras tecnologias de rádio. Por exemplo, uma estação DAB pode ter uma alternativa de transmissão analógica.

    Para permitir que ProgramSelector se encaixe na solução baseada em MediaBrowser ou MediaSession, defina um esquema de URI para serializar. O esquema é definido da seguinte maneira:

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

    Neste exemplo, a parte dos identificadores secundários (após o ponto de interrogação (?)) é opcional e pode ser removida para fornecer um identificador estável para uso como mediaId. Exemplo:

    • 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

    A parte de autoridade (também conhecida como host) de program oferece espaço para extensão de esquema no futuro. As strings do tipo de identificador são especificadas com precisão como os nomes na definição de IdentifierType do HAL 2.x, e o formato de valor é um número decimal ou hexadecimal (com prefixo 0x).

    Todos os identificadores específicos do fornecedor são representados pelo prefixo VENDOR_. Por exemplo, VENDOR_0 para VENDOR_START e VENDOR_1 para VENDOR_START mais 1. Esses URIs são específicos do hardware de rádio em que foram gerados e não podem ser transferidos entre dispositivos feitos por OEMs diferentes.

    Esses URIs precisam ser atribuídos a cada MediaItem nas pastas de rádio de nível superior. Além disso, a MediaSession precisa oferecer suporte a playFromMediaId e playFromUri. No entanto, o URI é destinado principalmente à extração de metadados de rádio (como frequência FM) e armazenamento persistente. Não há garantia de que o URI estará disponível para todos os itens de mídia (por exemplo, quando o tipo de ID principal ainda não tiver suporte ao framework). Por outro lado, o Media ID sempre funciona. Não é recomendável que os clientes usem URI para selecionar itens da sessão atual do MediaBrowser. Em vez disso, use playFromMediaId. No entanto, isso não é opcional para o app de veiculação, e os URIs ausentes são reservados para casos bem justificados.

    O design inicial usava um único dois-pontos em vez da sequência :// após a parte do esquema. No entanto, o primeiro não é aceito por android.net.Uri para referências de URI hierárquicas absolutas.

    Outros tipos de origem

    Outras fontes de áudio podem ser tratadas de maneira semelhante. Por exemplo, entrada auxiliar e o aparelho de CD de áudio.

    Um único app pode exibir vários tipos de origens. Nesses casos, recomendamos criar um MediaBrowserService separado para cada tipo de fonte. Mesmo em uma configuração com várias fontes/MediaBrowserServices servidas, é altamente recomendável ter uma única MediaSession em um único app.

    CD de áudio

    Semelhante a um CD de áudio, em que o app que serve esses discos expõe o MediaBrowser com uma única entrada pesquisável (ou mais, se o sistema tiver um trocador de CDs), que por sua vez conteria todas as faixas de um determinado CD. Se o sistema não tiver conhecimento sobre as faixas de cada CD (por exemplo, quando todos os discos forem inseridos em um cartucho de uma só vez e ele não os ler), o MediaItem de todo o disco será apenas PLAYABLE, não BROWSABLE mais PLAYABLE. Se não houver um disco em uma determinada posição, o item não será PLAYABLE nem BROWSABLE (mas cada posição precisa estar sempre presente na árvore).

     Estrutura em árvore de CD de áudio
    Figura 3. Estrutura em árvore de um CD de áudio.

    Essas entradas seriam marcadas de maneira semelhante às pastas de rádio de transmissão. Elas teriam campos extras adicionais definidos na API MediaDescription:

    • EXTRA_CD_TRACK: para cada MediaItem em CD de áudio, número da faixa com base em 1.
    • EXTRA_CD_DISK: número de disco com base 1.

    Para um sistema com CD-Text ativado e um disco compatível, o MediaItem de nível superior teria um título do disco. Da mesma forma, os MediaItems para faixas teriam o título da faixa.

    Entrada auxiliar

    O app que serve a entrada auxiliar expõe uma árvore MediaBrowser com uma única entrada (ou mais, quando há várias portas) que representa a porta AUX. A respectiva MediaSession recebe o mediaId e muda para essa origem depois de receber a solicitação playFromMediaId.

    Estrutura de árvore AUX
    Figura 4. Estrutura de árvore AUX.

    Cada entrada do MediaItem AUX teria um campo extra EXTRA_AUX_PORT_NAME definido como o nome não localizado da porta sem a frase "AUX". Por exemplo, "AUX 1" seria definido como "1", "AUX front" como "front" e "AUX" como uma string vazia. Em localidades que não são em inglês, a tag de nome vai permanecer com a mesma string em inglês. Ao contrário de EXTRA_BCRADIO_BAND_NAME_EN, os valores são definidos pelo OEM e não são restritos a uma lista predefinida.

    Se o hardware puder detectar dispositivos conectados à porta AUX, ele vai marcar o MediaItem como PLAYABLE, somente se a entrada estiver conectada. O hardware ainda precisa ser enumerado (mas não PLAYABLE) se nada estiver conectado a essa porta. Se o hardware não tiver esse recurso, o MediaItem sempre precisará ser definido como PLAYABLE.

    Campos extras

    Defina os seguintes 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"

    O cliente precisa analisar os MediaItems de nível superior para elementos com o campo extra EXTRA_CD_DISK ou EXTRA_AUX_PORT_NAME definido.

    Exemplos detalhados

    Os exemplos a seguir abordam a estrutura de árvore do MediaBrowser para tipos de origem que fazem parte deste design.

    MediaBrowserService de transmissão de rádio (processa ACTION_PLAY_BROADCASTRADIO):

    • Estações (navegáveis)EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_PROGRAMS
      • URI da BBC One (reproduzível): broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=90500
      • URI ABC 88.1 (reproduzível): broadcastradio://program/RDS_PI/5678?AMFM_FREQUENCY=88100
      • URI de ABC 88.1 HD1 (reproduzível): broadcastradio://program/HD_STATION_ID_EXT/158241DEADBEEF?AMFM_FREQUENCY=88100&RDS_PI=5678
      • URI de ABC 88.1 HD2 (reproduzível): broadcastradio://program/HD_STATION_ID_EXT/158242DEADBEFE
      • 90.5 FM (reproduzível) - FM sem RDSURI: broadcastradio://program/AMFM_FREQUENCY/90500
      • URI de 6h20 (ouvível): broadcastradio://program/AMFM_FREQUENCY/620
      • URI da BBC One (reproduzível): broadcastradio://program/DAB_SID_EXT/1E24102?RDS_PI=1234
    • Favoritos (navegáveis, reproduzíveis)EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_FAVORITES
      • URI da BBC One (reproduzível): broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=101300
      • BBC Two (não reproduzível)URI: broadcastradio://program/RDS_PI/1300?AMFM_FREQUENCY=102100
    • AM (navegável, reproduzível): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="AM"
      • URI de 5h30 (disponível): broadcastradio://program/AMFM_FREQUENCY/530
      • URI de 540 AM (reproduzível): broadcastradio://program/AMFM_FREQUENCY/540
      • URI de 550 AM (reproduzível): broadcastradio://program/AMFM_FREQUENCY/550
    • FM (navegável, reproduzível): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="FM"
      • URI de 87,7 FM (que pode ser reproduzido): broadcastradio://program/AMFM_FREQUENCY/87700
      • URI 87,9 FM (ouvível): broadcastradio://program/AMFM_FREQUENCY/87900
      • URI de 88.1 FM (que pode ser reproduzido): broadcastradio://program/AMFM_FREQUENCY/88100
    • DAB (reproduzível): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="DAB"

    MediaBrowserService de CD de áudio (processa ACTION_PLAY_AUDIOCD):

    • Disco 1 (pode ser reproduzido) EXTRA_CD_DISK=1
    • Disco 2 (com visualização e reprodução) EXTRA_CD_DISK=2
      • Faixa 1 (reproduzível) EXTRA_CD_TRACK=1
      • Faixa 2 (reproduzível) EXTRA_CD_TRACK=2
    • Meu CD de músicas (pode ser procurado e reproduzido) EXTRA_CD_DISK=3
      • All By Myself (playable) EXTRA_CD_TRACK=1
      • Reise, Reise (jogável) EXTRA_CD_TRACK=2
    • Posição 4 vazia (não jogável) EXTRA_CD_DISK=4

    MediaBrowserService AUX (processa ACTION_PLAY_AUX):

    • AUX frontal (reproduzível) EXTRA_AUX_PORT_NAME="front"
    • AUX traseira (disponível) EXTRA_AUX_PORT_NAME="rear"