Implementando rádio

A implementação do controle de rádio é baseada em MediaSession e MediaBrowse , que permitem que aplicativos de mídia e assistente de voz controlem o rádio. Para obter mais informações, consulte Criar aplicativos 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 . Esta biblioteca também contém extensões do ProgramSelector para converter de e para URI. Recomenda-se que as implementações de rádio usem esta biblioteca para construir a árvore de navegação associada.

Alternador de fonte de mídia

Para fornecer uma transição perfeita entre o rádio e outros aplicativos exibidos na mídia, a biblioteca car-media-common contém classes que devem ser integradas ao aplicativo de rádio. MediaAppSelectorWidget pode ser incluído no XML para o aplicativo de rádio (o ícone e a lista suspensa usados ​​na mídia de referência e nos aplicativos de rádio):

<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 o AppSelectionFragment , que exibe uma lista de fontes de mídia que podem ser alternadas. Se uma interface do usuário diferente da fornecida for desejada, você poderá criar um widget personalizado para iniciar o AppSelectionFragment quando o alternador deve ser exibido.

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

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

Especificações de controle detalhadas

A MediaSession (através MediaSession.Callback ) fornece mecanismos de controle para o programa de rádio atualmente em execução:

  • onPlay , onStop . (Des)silenciar a reprodução do rádio.
  • onPause . Pausa com deslocamento de tempo (se compatível).
  • onPlayFromMediaId . Reproduza qualquer conteúdo de uma pasta de nível superior. Por exemplo, "Tocar FM" ou "Tocar Rádio".
  • onPlayFromUri . Reproduza uma frequência específica. Por exemplo, "Reproduza 88,5 FM".
  • onSkipToNext , onSkipToPrevious . Sintonize uma estação seguinte ou anterior.
  • onSetRating . Adicionar ou remover de ou para Favoritos.

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

  • ( Opcional ) Programas (estações). Este 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 MediaBrowserService
Figura 1. 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 ajuste. Cada pasta de nível superior (AM/FM/Programs) é 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, "Reproduzir FM", "Reproduzir AM" e "Reproduzir Rádio" são consultas de rádio não específicas que usam um mediaId para enviar ao aplicativo de rádio OEM. Cabe ao aplicativo de rádio determinar o que tocar a partir da solicitação genérica e do mediaId.

MediaSession

Dado que não há o conceito de pausar um fluxo de transmissão, as ações Reproduzir, Pausar e Parar nem sempre se aplicam ao rádio. Com o rádio, a ação Parar está associada ao silenciamento do fluxo, enquanto o Play está associado à remoção do silenciamento.

Alguns sintonizadores de rádio (ou aplicativos) oferecem a capacidade de simular uma pausa de transmissão ao armazenar em cache o conteúdo e reproduzi-lo mais tarde. Nesses casos, use onPause .

A reprodução de ações mediaId e URI destina-se a sintonizar uma estação buscada na interface MediaBrowser. O mediaId é uma string arbitrária fornecida pelo aplicativo 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) com o qual identificar uma determinada estação . O URI será de um esquema bem definido. Em suma, 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 se move para uma frequência diferente.

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

Nota: O aplicativo de rádio não contém informações adicionais que seriam úteis para pesquisar um nome de estação não exposto ao cliente por meio da interface do MediaBrowser.

Saltar para a estação seguinte ou anterior depende do contexto atual:

  • Quando um aplicativo é sintonizado em uma estação da lista de Favoritos, o aplicativo pode passar 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.
  • Ouvir um canal arbitrário pode resultar na sintonização do próximo canal físico, mesmo quando não há sinal de transmissão.

O aplicativo de rádio trata dessas ações.

Manipulação de erros

As ações TransportControls (Play, Stop e Next) não fornecem comentários sobre se a ação foi bem-sucedida ou não. A única maneira de indicar um erro é definir o estado MediaSession como STATE_ERROR com uma mensagem de erro.

O aplicativo de rádio deve lidar com 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 deve ser alterado para STATE_CONNECTING (no caso de sintonia direta) ou STATE_SKIPPING_TO_PREVIOUS / NEXT enquanto o comando estiver sendo executado.

O cliente deve observar o PlaybackState e verificar se a sessão alterou o programa atual para o que foi solicitado ou entrou no estado de erro. STATE_CONNECTING não deve exceder 30s. No entanto, uma sintonia direta para uma determinada frequência AM/FM deve funcionar muito mais rápido.

Adicionando e removendo favoritos

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

Ao contrário das predefinições herdadas, este modelo assume uma lista de Favoritos não ordenada e ilimitada, quando cada favorito salvo foi alocado a um slot numérico (normalmente, de 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 devem ser selecionados primeiro antes de serem removidos. Esta é apenas uma limitação do cliente MediaBrowser, como um aplicativo complementar. O aplicativo de rádio não é restrito da mesma forma. Esta parte é opcional quando um aplicativo não suporta Favoritos.

Navegador de mídia

Para expressar quais frequências ou nomes de canais físicos (quando sintonizar um canal arbitrário é adequado 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 na faixa de 87,8 a 108,0 MHz (usando espaçamento de 0,2 MHz) e 117 canais AM na faixa 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 atualmente disponíveis é plana, pois não permite esquemas de exibição, como agrupamento por conjunto de transmissão direta de áudio (DAB).

As entradas na lista de Favoritos podem não ser ajustáveis. Por exemplo, se um determinado programa estiver fora do alcance. O aplicativo de rádio pode ou não detectar se a entrada pode ser sintonizada com antecedência. Nesse caso, pode não marcar a entrada como jogável.

Para identificar as pastas de nível superior, é aplicado o mesmo mecanismo usado pelo Bluetooth. Ou seja, um pacote 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 radiodifusão, 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 atualmente disponíveis.
    • BCRADIO_FOLDER_TYPE_FAVORITES = 2 . Favoritos.
    • BCRADIO_FOLDER_TYPE_BAND = 3 . Todos os canais físicos para uma determinada banda.

    Não há necessidade de definir campos de metadados personalizados específicos de rádio, pois todos os dados relevantes se encaixam no esquema MediaBrowser.MediaItem existente:

    • Nome do programa (RDS PS, nome do serviço DAB). 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 há necessidade de buscar a frequência FM para uma entrada no programa atual ou na lista de Favoritos (já que o cliente deve operar em IDs de mídia). No entanto, se tal necessidade surgir (por exemplo, para fins de exibição), ela estará presente no URI e poderá ser analisada para ProgramSelector . Dito isso, não é recomendado que o URI seja usado para selecionar itens na sessão atual. Para obter detalhes, consulte ProgramSelector .

    Para evitar problemas relacionados ao desempenho ou ao fichário, o serviço MediaBrowser deve oferecer suporte à paginação:

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

    As entradas relacionadas de todos os tipos de listas (canais brutos, programas encontrados e favoritos) podem ter diferentes mediaIds (depende do aplicativo de rádio; a biblioteca de suporte terá diferentes). Os URIs (no formato ProgramSelector) serão diferentes entre canais brutos e programas encontrados na maioria dos casos (exceto FM sem RDS); mas principalmente o mesmo entre os programas encontrados e os favoritos (exceto, por exemplo, quando o AF foi atualizado).

    Ter diferentes mediaIds para entradas de diferentes tipos de listas torna possível realizar ações diferentes sobre elas. Você pode percorrer a lista de Favoritos ou a lista de Todos os Programas em onSkipToNext , dependendo da pasta do MediaItem selecionado recentemente (consulte MediaSession ).

    Ações especiais de sintonia

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

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

    Ação Sintoniza para Como emitir
    Tocar rádio Qualquer canal de rádio startService(ACTION_PLAY_BROADCASTRADIO)
    ou playFromMediaId(MediaBrowser. getRoot() )
    Reproduzir FM Qualquer canal FM Reproduzir do mediaId da banda FM

    A determinação de qual programa sintonizar depende da aplicação. Este é normalmente o canal sintonizado mais recentemente da lista fornecida. Para obter detalhes sobre ACTION_PLAY_BROADCASTRADIO , consulte as intenções gerais de reprodução .

    Descoberta e conexão de serviço

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

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

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

    O aplicativo Radio pode restringir os pacotes do cliente com permissão para se conectar em uma implementação onGetRoot de seu serviço. O aplicativo deve permitir que os aplicativos do sistema se conectem sem a lista de permissões. Para obter detalhes sobre a lista de permissões, consulte Aceitar o pacote e a assinatura do aplicativo Assistant .

    Se o aplicativo específico de origem (por exemplo, um aplicativo de rádio) estiver instalado em um dispositivo sem esse suporte de origem, ele ainda se anunciará como manipulando a intenção ACTION_PLAY_BROADCASTRADIO , mas sua árvore MediaBrowser não conterá tags específicas de rádio. Assim, um cliente disposto a verificar se uma determinada fonte está disponível em um dispositivo, deve:

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

    Nota: Na maioria dos casos, o cliente deve varrer todas as árvores MediaBrowser disponíveis para detectar todas as fontes disponíveis para 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 seus MediaItem são strings localizadas que representam nomes de 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 para procurar certas bandas, uma tag extra é adicionada para pastas de bandas: EXTRA_BCRADIO_BAND_NAME_EN . Este é um nome não localizado da banda e só pode ter um destes valores predefinidos:

    • AM
    • FM
    • DAB
    • SXM

    Se a banda não estiver nesta lista, a etiqueta de nome da banda não deve ser definida. No entanto, se a banda estiver na lista, ela deve ter um conjunto de tags. O rádio HD não possui bandas separadas enumeradas, pois usa o mesmo meio subjacente que AM/FM.

    Intenções gerais de jogo

    Cada aplicativo dedicado à reprodução de determinada fonte (como rádio ou CD) deve lidar com uma intenção geral de reprodução , para iniciar a reprodução de algum conteúdo possivelmente do estado inativo (por exemplo, após a inicialização). Cabe ao aplicativo como selecionar o conteúdo a ser reproduzido, mas geralmente é o programa de rádio ou a faixa do CD reproduzido recentemente.
    Há uma intenção separada definida para cada fonte de áudio:

    • android.car.intent.action.PLAY_BROADCASTRADIO
    • android.car.intent.action.PLAY_AUDIOCD : CD-DA ou CD-Texto
    • android.car.intent.action.PLAY_DATADISC : disco de dados ópticos como CD/DVD, mas não CD-DA (pode ser 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 embutido)

    Os intents foram escolhidos para serem usados ​​no comando geral de reprodução, pois resolvem dois problemas ao mesmo tempo: o próprio comando geral de reprodução e a descoberta de serviço. O benefício adicional de ter essa intenção seria a possibilidade de executar essa ação simples sem abrir a sessão do MediaBrowser.

    A descoberta de serviço é, na verdade, o problema mais importante resolvido com essas intenções. O procedimento para descoberta de serviço é fácil e inequívoco dessa maneira (consulte Descoberta e conexão de serviço ).

    Para facilitar algumas implementações do cliente, existe uma forma alternativa de emitir tal comando Play (que também deve ser implementado pelo aplicativo de rádio): emitindo playFromMediaId com o rootId do nó raiz (usado como mediaId). Embora o nó raiz não deva ser reproduzido, seu rootId é uma string arbitrária que pode ser consumível como mediaId. No entanto, os clientes não são obrigados a entender essa nuance.

    Seletor de Programas

    Embora o mediaId seja suficiente para selecionar um canal do 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 digital, uma frequência simples não é suficiente para sintonizar uma estação específica. Portanto, use o ProgramSelector para sintonizar um canal analógico ou digital. ProgramSelector consiste em duas partes:

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

    Para habilitar o ajuste do ProgramSelector na solução baseada em MediaBrowser/MediaSession, defina um esquema de URI para serializá-lo. O esquema é definido da seguinte forma:

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

    Neste exemplo, a parte de 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 . Por 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 (AKA host) do program fornece algum espaço para extensão do esquema no futuro. As cadeias de tipo de identificador são especificadas com precisão como seus nomes na definição HAL 2.x de IdentifierType e o formato do 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 + 1 . Esses URIs são específicos do hardware de rádio no qual foram gerados e não podem ser transferidos entre dispositivos feitos por diferentes OEMs.

    Esses URIs devem ser atribuídos a cada MediaItem nas pastas de rádio de nível superior. Além disso, a MediaSession deve oferecer suporte a playFromMediaId e playFromUri . No entanto, o URI destina-se 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 for compatível com a estrutura). Por outro lado, o Media ID sempre funciona. Não é recomendado que os clientes usem URI para selecionar itens da sessão atual do MediaBrowser. Em vez disso, use playFromMediaId . Dito isso, não é opcional para o aplicativo de veiculação e os URIs ausentes são reservados para casos bem justificados.

    O projeto inicial usava dois pontos em vez da sequência :// após a parte do esquema. No entanto, o primeiro não é suportado pelo android.net.Uri para referências URI hierárquicas absolutas.

    Outros tipos de fonte

    Outras fontes de áudio podem ser tratadas de forma semelhante. Por exemplo, entrada auxiliar e leitor de CD de áudio.

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

    CD de áudio

    Semelhante ao CD de áudio, pois o aplicativo que atende a esses discos exporia o MediaBrowser com uma única entrada navegável (ou mais, se o sistema tiver um trocador de CD), que por sua vez conteria todas as faixas de um determinado CD. Se o sistema não tiver conhecimento sobre as faixas em cada CD (por exemplo, quando todos os discos são inseridos em um cartucho de uma vez e não lê todos eles), então MediaItem para o disco inteiro seria apenas PLAYABLE , não BROWSABLE+PLAYABLE . Se não houver disco em um determinado slot, o item não será PLAYABLE nem BROWSABLE (mas cada slot deve estar sempre presente na árvore).

    Estrutura de árvore de CD de áudio
    Figura 2. Estrutura em árvore do CD de áudio

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

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

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

    Entrada auxiliar

    O aplicativo que serve a entrada auxiliar expõe uma árvore do MediaBrowser com uma única entrada (ou mais, quando existem várias portas) representando a porta AUX in. A respectiva MediaSession pega seu mediaId e alterna para essa fonte após obter a solicitação playFromMediaId .

    Estrutura de árvore AUX
    Figura 3. Estrutura em árvore AUX

    Cada entrada AUX MediaItem teria um campo extra EXTRA_AUX_PORT_NAME definido para o nome não localizado da porta sem a frase "AUX". Por exemplo, "AUX 1" teria sido definido como "1", "AUX front" como "front" e "AUX" como uma string vazia. Em localidades diferentes do inglês, a tag de nome permaneceria a mesma string em inglês. Diferentemente de EXTRA_BCRADIO_BAND_NAME_EN , os valores são definidos pelo OEM e não restritos a uma lista predefinida.

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

    Campos extras

    Portanto, as seguintes chaves extras devem ser definidas:

    • 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 revisar os MediaItems de nível superior para elementos com o conjunto de campos extra EXTRA_CD_DISK ou EXTRA_AUX_PORT_NAME .

    Exemplos detalhados

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

    Transmissão de rádio MediaBrowserService (trata ACTION_PLAY_BROADCASTRADIO ):

    • Estações (navegáveis)
      EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_PROGRAMS
      • BBC One (jogável)
        URI: broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=90500
      • ABC 88.1 (jogável)
        URI: broadcastradio://program/RDS_PI/5678?AMFM_FREQUENCY=88100
      • ABC 88.1 HD1 (jogável)
        URI: broadcastradio://program/HD_STATION_ID_EXT/158241DEADBEEF?AMFM_FREQUENCY=88100&RDS_PI=5678
      • ABC 88.1 HD2 (jogável)
        URI: broadcastradio://program/HD_STATION_ID_EXT/158242DEADBEFE
      • 90,5 FM (jogável) – FM sem RDS
        URI: broadcastradio://program/AMFM_FREQUENCY/90500
      • 620 AM (jogável)
        URI: broadcastradio://program/AMFM_FREQUENCY/620
      • BBC One (jogável)
        URI: broadcastradio://program/DAB_SID_EXT/1E24102?RDS_PI=1234
    • Favoritos (navegáveis, jogáveis)
      EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_FAVORITES
      • BBC One (jogável)
        URI: broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=101300
      • BBC Two (não jogável)
        URI: broadcastradio://program/RDS_PI/1300?AMFM_FREQUENCY=102100
    • AM (navegável, jogável)
      EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BAND
      EXTRA_BCRADIO_BAND_NAME_EN="AM"
      • 530 AM (jogável)
        URI: broadcastradio://program/AMFM_FREQUENCY/530
      • 540 AM (jogável)
        URI: broadcastradio://program/AMFM_FREQUENCY/540
      • 550 AM (jogável)
        URI: broadcastradio://program/AMFM_FREQUENCY/550
    • FM (navegável, reproduzível)
      EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BAND
      EXTRA_BCRADIO_BAND_NAME_EN="FM"
      • 87,7 FM (jogável)
        URI: broadcastradio://program/AMFM_FREQUENCY/87700
      • 87,9 FM (jogável)
        URI: broadcastradio://program/AMFM_FREQUENCY/87900
      • 88,1 FM (jogável)
        URI: broadcastradio://program/AMFM_FREQUENCY/88100
    • DAB (jogável)
      EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BAND
      EXTRA_BCRADIO_BAND_NAME_EN="DAB"

    CD de áudio MediaBrowserService (trata ACTION_PLAY_AUDIOCD ):

    • Disco 1 (jogável)
      EXTRA_CD_DISK=1
    • Disco 2 (navegável, reproduzível)
      EXTRA_CD_DISK=2
      • Faixa 1 (jogável)
        EXTRA_CD_TRACK=1
      • Faixa 2 (jogável)
        EXTRA_CD_TRACK=2
    • Meu CD de música (navegável, reproduzível)
      EXTRA_CD_DISK=3
      • Tudo por mim mesmo (jogável)
        EXTRA_CD_TRACK=1
      • Reise, Reise (jogável)
        EXTRA_CD_TRACK=2
    • Slot 4 vazio (não jogável)
      EXTRA_CD_DISK=4

    AUX MediaBrowserService (trata ACTION_PLAY_AUX ):

    • Frente AUX (jogável)
      EXTRA_AUX_PORT_NAME="front"
    • AUX traseiro (jogável)
      EXTRA_AUX_PORT_NAME="rear"