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. 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 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.
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 pastaBROADCASTRADIO_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, consulteProgramSelector
.Para evitar problemas de desempenho ou relacionados ao Binder, o serviço MediaBrowser precisa oferecer suporte à paginação:
EXTRA_PAGE
EXTRA_PAGE_SIZE
- Parâmetros extras para
subscribe()
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 deMediaItem
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 comFLAG_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, chameresolveService
com a intentACTION_PLAY_BROADCASTRADIO
(consulte Intents gerais de reprodução) e a flagMATCH_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), usequeryIntentServices
.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 econnect
. Depois de estabelecer a conexão, um identificador para MediaSession pode ser obtido porgetSessionToken
.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:- Descubra o serviço de rádio (chame
resolveService
paraACTION_PLAY_BROADCASTRADIO
). - Crie e se conecte ao
MediaBrowser
. - Determine a presença de
MediaItem
comEXTRA_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 deMediaItem
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-Textandroid.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 AUXandroid.car.intent.action.PLAY_BLUETOOTH
android.car.intent.action.PLAY_USB
: sem especificar qual dispositivo USBandroid.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 noMediaBrowserService
, 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. OProgramSelector
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 emMediaBrowser
ouMediaSession
, 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 comomediaId
. 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 deIdentifierType
do HAL 2.x, e o formato de valor é um número decimal ou hexadecimal (com prefixo0x
).Todos os identificadores específicos do fornecedor são representados pelo prefixo
VENDOR_
. Por exemplo,VENDOR_0
paraVENDOR_START
eVENDOR_1
paraVENDOR_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
eplayFromUri
. 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, useplayFromMediaId
. 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 porandroid.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ãoBROWSABLE
maisPLAYABLE
. Se não houver um disco em uma determinada posição, o item não seráPLAYABLE
nemBROWSABLE
(mas cada posição precisa estar sempre presente na árvore).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 cadaMediaItem
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
.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 deEXTRA_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ãoPLAYABLE
) se nada estiver conectado a essa porta. Se o hardware não tiver esse recurso, o MediaItem sempre precisará ser definido comoPLAYABLE
.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
ouEXTRA_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
- URI da BBC One (reproduzível):
- 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
- URI da BBC One (reproduzível):
- 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
- URI de 5h30 (disponível):
- 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
- URI de 87,7 FM (que pode ser reproduzido):
- 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
- Faixa 1 (reproduzível)
- 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
- All By Myself (playable)
- 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"