O diagrama a seguir ilustra os componentes que interagem com a mídia.
Figura 1. Componentes do sistema
Os elementos desta figura são descritos abaixo:
Componente | Descrição |
---|---|
Tela inicial | Representa outras superfícies na IU do carro que exibem e controlam a mídia em reprodução no momento. No AOSP, esta é a tela principal exibida quando o sistema é iniciado. Nessa tela, os usuários podem visualizar detalhes do item de mídia que está sendo reproduzido e executar um conjunto limitado de ações padrão e personalizadas (por exemplo, Reproduzir e Pausar). |
IU do sistema | Fornece funcionalidade que inclui opções globais de navegação da interface do usuário, como navegar para Mídia. |
Assistentes | O Android fornece mecanismos para que diferentes aplicativos de assistente de voz interajam com o sistema. Esses aplicativos podem interagir com as fontes de mídia em segundo plano (por exemplo, tocar uma música como resultado de um comando de voz) ou navegar até a mídia em primeiro plano (por exemplo, quando um aplicativo de assistente de voz é instruído a exibir a interface do usuário de um Fonte de Mídia específica). |
Iniciador de aplicativos | Todos os aplicativos Android iniciam no App Launcher, incluindo fontes de mídia. A mídia pode apresentar seu próprio seletor de fonte de mídia, complementando ou substituindo o App Launcher como ponto de partida para a mídia. |
Loja de aplicativos do Google | Quando o GAS está sendo usado, é aqui que os usuários localizam e instalam novos aplicativos em um dispositivo Android. Para mídia, uma vez que os aplicativos são instalados, os usuários são direcionados para a Mídia para concluir o processo de entrada ou para começar a interagir com o aplicativo. |
Gerenciador de sessão de mídia | Serviço do sistema Android que rastreia e controla as sessões de mídia de todas as fontes de mídia. Ele fornece mecanismos para detectar quando uma fonte de mídia se torna a fonte de mídia de primeiro plano . Mídia e todos os outros aplicativos que exibem a fonte de mídia em reprodução no momento (por exemplo, a tela inicial), use o Media Session Manager para detectar esses eventos e atualizar a interface do usuário de acordo. As fontes de mídia interagem com o Media Session Manager por meio da API de sessão de mídia. |
Rádio | Aplicativo especializado para interagir com o hardware do rádio. O rádio procura estações de rádio, selecionando rapidamente as estações identificadas recentemente e alternando entre as bandas de rádio. Os componentes de interface do usuário compartilhados por Rádio e Mídia permitem que o usuário alterne entre as duas experiências. |
Motor de distração do motorista | Serviço do sistema Android usado para impor restrições de UX com base no estado de condução do carro. Para o login de fontes de mídia e configurações UX (onde a tela é controlada diretamente pelas fontes de mídia), este serviço garante que nenhum conteúdo inseguro seja exibido quando o carro estiver no estado de condução. Os OEMs podem personalizar a definição desses estados e como o sistema reage nessas situações (por exemplo, exibindo uma sobreposição de tela de bloqueio). |
Fluxos do usuário
Lançamento de aplicativo de mídia
O processo pelo qual o Media é iniciado aparece abaixo.
Figura 2. Inicialização do aplicativo de mídia
A mídia deve ser iniciada usando o seguinte CAR_INTENT_ACTION_MEDIA_TEMPLATE implícito . Essa intenção pode ter as seguintes informações como extras :
android.car.intent.extra.MEDIA_COMPONENT
( opcional ). String extra para representar o nome do componente achatado de um MediaBrowserService no aplicativo de mídia ao qual a mídia deve se conectar. Se não for fornecido, Mídia exibe o aplicativo de mídia selecionado no momento. Essa intenção é usada a partir dos seguintes pontos de entrada:IU do sistema. Usado para retornar à experiência de mídia ou para começar a usá-la pela primeira vez. Nesse caso, o Intent acima seria usado sem nenhum extra para fazer com que o Media exiba o aplicativo de mídia selecionado no momento.
Tela inicial, Assistentes e Central de notificações. Os usuários podem navegar até Mídia para exibir o aplicativo de mídia selecionado no momento. Em todos os casos, o Intent implícito sem extras é acionado.
Iniciador de aplicativos. Quando os usuários selecionam um aplicativo de mídia no App Launcher, a intenção acima inclui o extra CAR_EXTRA_MEDIA_COMPONENT , que contém o aplicativo de mídia selecionado. A mídia designa isso como o aplicativo recém-selecionado e se conecta a ele. Para obter detalhes, consulte a seção abaixo, Integração do inicializador de aplicativos com a mídia.
Iniciador de aplicativos para integração de mídia
Os aplicativos de mídia não têm permissão para fornecer nenhuma atividade anotada com a categoria android.intent.category.LAUNCHER
. Como resultado, o App Launcher (ou seu equivalente) deve implementar uma lógica especial para abordar a integração da fonte de mídia:
O Iniciador de Aplicativos deve verificar o sistema em busca de pacotes que implementam
MediaBrowserService.SERVICE_INTERFACE
. Para esses pacotes, o App Launcher busca o ícone de serviço semelhante ao usado para buscar outras atividades.O App Launcher combina esses pacotes com aqueles que implementam atividades
android.intent.category.LAUNCHER
. Se um aplicativo fornecer uma implementação MediaBrowserService e uma atividade do iniciador, o serviço terá precedência.Até o momento, nenhum aplicativo de origem de mídia pode fornecer uma atividade de iniciador.
- Um exemplo dessa lógica pode ser encontrado no código AOSP em
AppLauncherUtils#getAllLauncherApps() .
Fluxo de login e opções de configuração
Os aplicativos de mídia podem incluir uma atividade de configurações otimizada para o veículo. Essa atividade pode ser usada para implementar fluxos de usuários não abordados pelas APIs do Android Media, por exemplo:
- Entrar
- Sair
- Troca de conta
- Exibição na qual o usuário está conectado no momento (se houver)
- Configuração do serviço
Figura 3. Fluxo de login
Essa atividade de configurações é declarada pelo aplicativo de mídia com o seguinte filtro de intenção.
<activity android:name=".AppSettingsActivity" android:exported="true android:theme="@style/SettingsActivity" android:label="@string/app_settings_activity_title"> <intent-filter> <action android:name="android.intent.action.APPLICATION_PREFERENCES"/> </intent-filter> </activity>
A mídia deve implementar a seguinte lógica:
Verifique se o aplicativo de mídia selecionado atualmente inclui uma atividade com o filtro de intenção fornecido.
Em caso afirmativo, permita que o usuário navegue até a atividade.
Se as Restrições de UX do carro estiverem em vigor (por exemplo, o carro estiver em movimento), essa affordance deve ser desativada, pois a atividade de configurações não é uma interface de usuário otimizada para o motorista.
Tratamento de erros e login obrigatório
A mídia interage com aplicativos de mídia por meio da API Android Media Session. Como parte dessa API, Media recebe um objeto PlaybackState , que comunica o estado atual do aplicativo de mídia.
O processo de login começa quando o aplicativo de mídia altera PlaybackState para STATE_ERROR , incluindo um código de erro específico (veja os detalhes abaixo). Quando isso acontece, a mídia exibe a descrição do erro e uma affordance para navegar até uma atividade de login implementada pelo aplicativo de mídia.
Esse mesmo fluxo pode ser usado por aplicativos para sinalizar outras situações de erro (por exemplo, um erro de conectividade do servidor).
Figura 4. Tratamento de erros
Como parte do tratamento normal de erros do PlaybackState, a mídia deve verificar a entrada a seguir.
Código de erro
PlaybackState
igual aPlaybackStateCompat#ERROR_CODE_AUTHENTICATION_EXPIRED
. Isso sinalizará que o aplicativo de mídia requer login para continuar a operação. Outros códigos de erro podem ser recebidos, o que indicaria outros tipos de situações de erro.A mensagem de erro
PlaybackState
(definida por aplicativos de mídia usando o métodoPlaybackStateCompat.Builder#setErrorMessage
) conterá uma explicação legível (por exemplo, "Você não está conectado."). Esta mensagem deve ser exibida ao usuário e deve ser otimizada para distração de condução (DO). Para obter detalhes, consulte Restrições de condução de UX.Opcionalmente,
PlaybackState
pode incluir os seguintes extras (definidos por aplicativos de mídia com o método PlaybackStateCompat.Builder#setExtras ) com as seguintes chaves.android.media.extras.ERROR_RESOLUTION_ACTION_LABEL
. Defina como uma sequência que contém a mensagem legível a ser exibida no botão tocado pelo usuário para iniciar o fluxo de entrada.android.media.extras.ERROR_RESOLUTION_ACTION_INTENT
. Definido com um PendingIntent para ser acionado quando o usuário clicar no botão acima mencionado. EstePendingIntent
aponta para uma atividade de entrada personalizada implementada pelo mesmo aplicativo de mídia.
O estado
PlaybackState
é igual a STATE_ERROR . Isso sinaliza que nenhuma outra operação é possível até que o login seja concluído.