Implementação de controles de rádio

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

Uma implementação de árvore de navegação de mídia é fornecida ao conjunto de dados do biblioteca em packages/apps/Car/libs. Essa biblioteca também contém extensões de ProgramSeletor a ser convertido de e para o URI. Recomenda-se que as implementações de rádio use 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 à rádio app. MediaAppSelectorWidget pode 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 a AppSelectionFragment, que mostra uma lista das fontes de mídia que podem ser alternadas. Se você quiser uma interface diferente da fornecida, é possível criar um widget personalizado para iniciar a AppSelectionFragment quando o seletor será exibido.

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

Um exemplo de implementação é fornecido na implementação do app de rádio de referência. localizado em packages/apps/Car/Radio.

Especificações de controle detalhadas

O MediaSession (através de MediaSession.Callback) interface fornece mecanismos de controle para o programa de rádio em reprodução:

  • onPlay, onStop. (Ative) o som da reprodução de rádio.
  • onPause: Pausa com horário definido (se compatível).
  • onPlayFromMediaId: Reproduza qualquer conteúdo de uma pasta de nível superior. Por exemplo, "Tocar FM" ou "Tocar rádio".
  • onPlayFromUri: Tocar uma frequência específica. Por exemplo, "Tocar FM 88.5".
  • onSkipToNext, onSkipToPrevious. Ajustar para próximo ou anterior estação
  • onSetRating: adicionar ou remover dos favoritos;

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

  • (Opcional) Programas (estações). Esse modo normalmente é usado por rádios com sintonizador duplo para indicar todas as estações de rádio ajustáveis disponíveis no local do usuário.
  • Favoritos. Programas de rádio adicionados à lista de favoritos, alguns podem ser indisponível (fora do alcance da 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 faixa tem um diretório de nível superior separado.
.
Estrutura de árvore do MediaBrowserService
Figura 2. Estrutura de árvore do MediaBrowserService

Cada elemento em cada uma dessas pastas (AM/FM/Programas) é um MediaItem com um URI que pode ser usado e o MediaSession a serem ajustados. Cada pasta de nível superior (AM/FM/Programas) é um MediaItem com um mediaId que pode ser usado com o MediaSession para acionar a reprodução e fica a critério do OEM. Para por exemplo, "Tocar FM", "Tocar AM" e "Tocar rádio" são consultas de rádio não específicas que usam uma mediaId a ser enviado ao app de rádio do OEM. Cabe ao app de rádio determinar o que reproduzir do uma solicitação genérica e o mediaId.

MediaSession

Como não existe o conceito de pausar um stream 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 som do stream. enquanto o recurso Reproduzir está associado à remoção da desativação do som.

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

A reprodução a partir de ações de mediaId e URI serve para sintonizar uma estação buscada na interface MediaBrowser. mediaId é uma string arbitrária fornecidos pelo app de rádio para impor um atributo exclusivo (para que um determinado ID aponte para apenas um item) e estável (de forma que um determinado item tenha o mesmo ID em toda a sessão) com o qual para identificar uma determinada estação. O URI terá um esquema bem definido. Em resumo, um URI de ProgramSeletor. Embora isso preserve o atributo de uniquidade, ele não precisa estável, embora possa mudar quando a estação passa para uma frequência diferente.

Por padrão, onPlayFromSearch não é usado. É responsabilidade do cliente (aplicativo complementar) para selecionar um resultado da pesquisa na árvore do MediaBrowser. Transporte que a responsabilidade com o app de rádio aumentaria a complexidade e exigiria contratos formais sobre como consultas de string devem aparecer e resultar em uma experiência do usuário desigual em diferentes hardwares plataformas.

Observação: o app de rádio não tem informações úteis para buscar um nome de estação não exposto ao cliente por meio da interface MediaBrowser.

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

  • Quando um app é sintonizado em uma estação na lista "Favoritos", o app pode passar para a próxima estação a partir da lista de favoritos.
  • Ouvir uma estação na lista "Programa" pode resultar na sintonização da próxima estação estação disponível, classificada de acordo com o número do canal.
  • Ouvir um canal arbitrário pode resultar no ajuste do próximo canal físico, mesmo sem sinal de transmissão.

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

Tratamento de erros

TransportControls (Reproduzir, Parar e Próximo) não informa se a ação ter sucesso ou não. A única maneira de indicar um erro é definir o MediaSession estado para 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 de reprodução não for imediata, o estado da reprodução deverá 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 assistir ao 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, a sintonização direta de um determinado A frequência de AM/FM deve ter um desempenho muito mais rápido.

Adicionar e remover favoritos

O 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 atualmente sintonizada na lista Favoritos.

Ao contrário das predefinições legadas, esse modelo pressupõe uma opção de Favoritos ilimitados e não ordenados lista, quando cada favorito salvo foi alocado para um slot numérico (normalmente de 1 a 6). Como resultado, os sistemas baseados em predefinição seriam incompatíveis com onSetRating operação

A limitação da API MediaSession é que apenas a estação atualmente sintonizada podem ser adicionadas ou removidas. Por exemplo, os itens devem ser selecionados antes de podem ser removidas. Essa é apenas uma limitação do cliente MediaBrowser, como uma app complementar. O app de rádio não tem restrições semelhantes. Esta parte é opcional quando um app não é compatível com a seção "Favoritos".

MediaBrowser

Para expressar quais frequências ou nomes de canais físicos (ao sintonizar para um canal arbitrário seja adequado para determinada tecnologia de rádio) são válidos para em determinada região, todos os canais válidos (frequências) são listados para cada faixa. Na região dos EUA, isso equivale a 101 canais FM no intervalo de 87,8 a Intervalo de 108,0 MHz (usando espaçamento de 0,2 MHz) e canais de 117 AM no intervalo de 530 a 1.700 kHz (usando espaçamento de 10 kHz). Como a 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 é fixa, porque isso não permite exibir esquemas, como o agrupamento por conjunto de transmissão de áudio direta (DAB, na sigla em inglês).

As entradas na lista de Favoritos podem não ser ajustáveis. Por exemplo, se um determinado de rede está fora do intervalo. O aplicativo de rádio pode ou não detectar se a entrada podem ser ajustados antecipadamente. Nesse caso, talvez a entrada não seja marcada como jogável.

Para identificar pastas de nível superior, é aplicado o mesmo mecanismo usado pelo Bluetooth. Ou seja, um pacote de extras do MediaDescription contém um campo específico do sintonizador, assim como o Bluetooth faz com EXTRA_BT_FOLDER_TYPE. No caso do rádio de transmissã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 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 para rádio, já que 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 de FM. URI (consulte ProgramSeletor) 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 lista de Favoritos (pois o cliente deve operar em mídia ). No entanto, caso surja tal necessidade (por exemplo, para fins de exibição), presentes no URI e podem ser analisados para ProgramSelector. Por isso, não é recomendado usar o URI para selecionar itens no diretório atual sessão. 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:a paginação é implementada por padrão na onLoadChildren() sem processamento de opções.

    Entradas relacionadas de todos os tipos de listas (canais brutos, programas encontrados e favoritos) podem ter mediaIds diferentes (depende do app de rádio; suporte biblioteca os terá diferentes). Os URIs (no formato ProgramSeletor) diferem entre canais brutos e programas encontrados na maioria dos casos (exceto para FM sem RDS), mas são praticamente os mesmos entre os programas encontrados e os favoritos (exceto por exemplo, quando a PD foi atualizada).

    Ter diferentes mediaIds para entradas de diferentes tipos de listas facilita será possível realizar ações diferentes neles. Você pode percorrer a lista de Favoritos ou a lista Todos os programas em onSkipToNext, dependendo da pasta do arquivo MediaItem selecionados (consulte MediaSession).

    Ações especiais de ajuste

    A lista de programas permite que os usuários sintonizem uma estação específica, mas não permite que os usuários fazer solicitações gerais, como "Sintonizar para FM", o que pode resultar na sintonização de um ouvi a estação na banda FM.

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

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

    OU

    playFromMediaId(MediaBrowser.getRoot())
    Tocar FM Qualquer canal de FM Tocar no mediaId da banda FM.

    A determinação de qual programa ajustar depende do app. Isso é normalmente é o canal sintonizado mais recentemente da lista fornecida. Para detalhes sobre ACTION_PLAY_BROADCASTRADIO, consulte Intents gerais de reprodução:

    Descoberta e conexão de serviço

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

    O serviço resolvido processa a vinculação android.media.browse.MediaBrowserService. a intenção de compra. Isso foi verificado com o GTS.

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

    O app Radio pode restringir pacotes clientes com permissão para se conectar em uma onGetRoot implementação do serviço. O app precisa permitir que apps do sistema se conectem sem a lista de permissões. Para detalhes sobre a lista de permissões, consulte Aceite o pacote e a assinatura do app do Assistente.

    Se o app específico da fonte (por exemplo, um app de rádio) estiver instalado em um dispositivo sem esse suporte de origem, ele ainda se anunciaria como processando o ACTION_PLAY_BROADCASTRADIO, mas a árvore MediaBrowser não contêm tags específicas para rádio. Assim, um cliente disposto a verificar se um determinado fonte está disponível em um dispositivo, deve:

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

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

    Nomes de banda

    A lista de bandas é representada por um conjunto de diretórios de nível superior com um tipo de pasta tag definida como BCRADIO_FOLDER_TYPE_BAND. Do MediaItem da criança títulos são strings localizadas que representam os nomes das bandas. Na maioria dos casos, será é igual à 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 pulseiras, um uma tag extra foi adicionada para as pastas da pulseira EXTRA_BCRADIO_BAND_NAME_EN. Isso é um nome não localizado da banda e pode usar apenas um destes valores predefinidos:

    • AM
    • FM
    • DAB

    Se a pulseira não estiver na lista, a tag com o nome dela não deverá ser colocada. No entanto, se a banda estiver na lista, ela precisará ter uma tag definida. O rádio HD não enumerar bandas separadas, já que usa o mesmo meio subjacente que AM/FM.

    Intents gerais de reprodução

    Cada app dedicado a reproduzir determinada fonte (como rádio ou CD) precisa processar um intenção geral play de começar a reproduzir conteúdo, possivelmente de inativo (por exemplo, após a inicialização). Cabe ao aplicativo escolher como selecionar o conteúdo ser reproduzido, mas normalmente é o programa de rádio ou a faixa de CD tocado recentemente. intent 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 ópticos 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 auxiliar
    • android.car.intent.action.PLAY_BLUETOOTH
    • android.car.intent.action.PLAY_USB: sem especificar qual Dispositivo USB
    • android.car.intent.action.PLAY_LOCAL: armazenamento em mídia local (Flash integrado)

    As intents foram escolhidas para serem usadas no comando geral de reprodução, porque resolvem dois problemas ao mesmo tempo: o próprio comando geral de reprodução e a descoberta de serviços. O benefício adicional de ter tal intenção seria a possibilidade de executar tal intenção ação simples sem abrir a sessão do MediaBrowser.

    A descoberta de serviços é, na verdade, o problema mais importante resolvido com intents. Dessa forma, o procedimento de descoberta de serviços é fácil e inequívoco (consulte descoberta e conexão de serviço).

    Para facilitar algumas implementações de cliente, há uma forma alternativa de emitindo esse comando Play (que também precisa ser implementado pelo app de rádio): emitindo playFromMediaId com o rootId do nó raiz (usado como mediaId). Enquanto o nó raiz não foi projetado para ser reproduzido, seu rootId é uma string arbitrária que pode ser consumível como mediaId. No entanto, os clientes não precisam para entender essa nuance.

    Seletor de programa

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

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

    • Identificador principal. Um identificador exclusivo e estável para um determinado rádio estação que não muda, mas que pode não ser suficiente para sintonizar essa estação. Por exemplo: Código PI do RDS, que pode ser traduzido para o indicativo de chamada nos EUA.
    • Identificadores secundários. Outros identificadores úteis para ajustes para essa estação (por exemplo, frequência), possivelmente incluindo identificadores de outros de rádio. Por exemplo, uma estação DAB pode ter um substituto de transmissão analógico.

    Para permitir que o ProgramSelector se encaixe nos campos MediaBrowser ou baseada em MediaSession, defina um esquema de URI para serializá-lo. 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 removido 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 (host, também conhecida como host) do program, fornece espaço para no futuro. As strings do tipo de identificador são especificadas com precisão como nomes na definição de IdentifierType da HAL 2.x e o valor formato é um número decimal ou hexadecimal (com prefixo 0x).

    Todos os identificadores específicos do fornecedor são representados pelo VENDOR_. . Por exemplo, VENDOR_0 para VENDOR_START e VENDOR_1 por 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 feitas por diferentes OEMs.

    Esses URIs devem ser atribuídos a cada MediaItem no botão de opção de nível superior do Google Cloud. Além disso, a MediaSession precisa oferecer suporte a playFromMediaId e playFromUri. No entanto, o URI é destinado principalmente a rádios Extração de metadados (como frequência FM) e armazenamento permanente. Não há garantir que o URI esteja disponível para todos os itens de mídia (por exemplo, quando o O tipo de ID ainda não é compatível com o framework). Por outro lado, o ID de mídia sempre funciona. Não é recomendado que os clientes usem URI para selecionar itens do sessão atual do MediaBrowser. Em vez disso, use playFromMediaId. Dito isso, é não é opcional para o aplicativo de exibição, e os URIs ausentes são reservados para casos justificados.

    O design inicial usou dois-pontos em vez da sequência ://. após a parte do esquema. No entanto, o primeiro não é compatível com android.net.Uri para referências de URI hierárquicas absolutas.

    Outros tipos de origem

    Outras fontes de áudio podem ser tratadas da mesma forma. Por exemplo, a entrada auxiliar e o CD player de áudio.

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

    CD de áudio

    Semelhante ao CD de áudio, porque o aplicativo que fornece esses discos Exponha o MediaBrowser com uma única entrada navegável (ou mais, se o sistema tiver uma CD, que por sua vez conteria todas as faixas de um determinado CD. Se o sistema não tem conhecimento sobre os rastros de cada CD (por exemplo, quando todos os discos são inseridos em um cartucho de uma vez e ele não lê todos eles), O MediaItem de todo o disco seria apenas PLAYABLE, e não BROWSABLE mais PLAYABLE. Se não houver disco em um em um determinado espaço, o item não seria PLAYABLE nem BROWSABLE mas cada slot deve sempre estar presente na árvore.

     Estrutura de árvore de CD de áudio
    Figura 3. Estrutura de árvore do CD de áudio.

    Essas entradas seriam marcadas de maneira semelhante a transmitir pastas de rádio. are; elas conteriam campos extras adicionais definidos na API MediaDescription:

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

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

    Entrada auxiliar

    O aplicativo que fornece a entrada auxiliar expõe uma árvore MediaBrowser com uma única entrada (ou mais, quando há várias portas) representando a entrada auxiliar. A respectiva MediaSession realiza mediaId e alterna para essa origem depois de receber a solicitação playFromMediaId.

    Estrutura de árvore auxiliar
    Figura 4. estrutura de árvore auxiliar.

    Cada entrada AUX MediaItem teria um campo extra EXTRA_AUX_PORT_NAME definido como o nome não localizado da porta. sem o "AUX" frase Por exemplo, "AUX 1" será definida como "1", "AUX frente" para "frente" e "AUX" como uma string vazia. Em localidades diferentes do inglês, o nome permanece a mesma string em inglês. Improvável como 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, ele deverá marcar o MediaItem como PLAYABLE, somente se a entrada estiver conectada. O hardware precisa ainda pode ser enumerado (mas não PLAYABLE) se nada estiver conectado a esse porta Se o hardware não possui tal capacidade, o MediaItem deve sempre 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 em busca de elementos que têm o EXTRA_CD_DISK ou EXTRA_AUX_PORT_NAME campo extra definido.

    Exemplos detalhados

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

    Rádio de transmissão MediaBrowserService (gerencia ACTION_PLAY_BROADCASTRADIO):

    • Estações (navegáveis)EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_PROGRAMS
      • URI da BBC One (jogável): broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=90500
      • URI ABC 88.1 (jogável): broadcastradio://program/RDS_PI/5678?AMFM_FREQUENCY=88100
      • URI ABC 88.1 HD1 (jogável): broadcastradio://program/HD_STATION_ID_EXT/158241DEADBEEF?AMFM_FREQUENCY=88100&RDS_PI=5678
      • URI ABC 88.1 HD2 (jogável): broadcastradio://program/HD_STATION_ID_EXT/158242DEADBEFE
      • 90.5 FM (jogável) - FM sem RDSURI: broadcastradio://program/AMFM_FREQUENCY/90500
      • URI 620 AM (jogável): broadcastradio://program/AMFM_FREQUENCY/620
      • URI da BBC One (jogável): broadcastradio://program/DAB_SID_EXT/1E24102?RDS_PI=1234
    • Favoritos (navegáveis, jogáveis)EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_FAVORITES
      • URI da BBC One (jogável): broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=101300
      • URI da BBC Two (não reproduzível): 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"
      • 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 e reproduzível): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="FM"
      • URI 87.7 FM (reproduzível): broadcastradio://program/AMFM_FREQUENCY/87700
      • URI 87.9 FM (reproduzível): broadcastradio://program/AMFM_FREQUENCY/87900
      • URI 88.1 FM (reproduzível): broadcastradio://program/AMFM_FREQUENCY/88100
    • DAB (jogável): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="DAB"

    CD de áudio MediaBrowserService (gerencia 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
    • CD da minha música (navegável e reproduzível) EXTRA_CD_DISK=3
      • All By Myself (jogável) EXTRA_CD_TRACK=1
      • Reise, Reise (jogável) EXTRA_CD_TRACK=2
    • Slot 4 vazio (não reproduzível) EXTRA_CD_DISK=4

    AUX MediaBrowserService (gerencia ACTION_PLAY_AUX):

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