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 na tabela:
Componente | Descrição |
---|---|
Tela inicial | Representa outras plataformas na interface do carro que mostram e controlam a mídia em reprodução. No AOSP, essa é a tela principal exibida quando o sistema é iniciado. Nessa tela, os usuários podem conferir 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"). |
Interface do sistema | Oferece funcionalidades que incluem opções de navegação globais da interface, como navegar até a mídia. |
Assistentes | O Android oferece mecanismos para que diferentes apps de assistentes por voz interajam com o sistema. Esses apps podem interagir com as fontes de mídia em segundo plano (por exemplo, reproduzir uma música como resultado de um comando de voz) ou navegar até a mídia em primeiro plano (por exemplo, quando um app de assistente de voz é instruído a mostrar a interface de uma fonte de mídia específica). |
Acesso rápido aos apps | Todos os apps Android são iniciados no Acesso rápido aos apps, incluindo as fontes de mídia. A mídia pode apresentar o próprio seletor de origem de mídia, complementando ou substituindo o App Launcher como ponto de partida para a mídia. |
Google Play Store | Quando o GAS está sendo usado, é aqui que os usuários localizam e instalam novos apps em um dispositivo Android. Para mídia, depois que os apps são instalados, os usuários são direcionados para a mídia para concluir o processo de login ou começar a interagir com o app. |
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 em primeiro plano. A mídia e todos os outros apps que mostram a fonte de mídia em reprodução (por exemplo, a tela inicial) usam o Media Session Manager para detectar esses eventos e atualizar a interface de acordo. As fontes de mídia interagem com o Media Session Manager por meio da API Media Session. |
Rádio | App especializado para interagir com o hardware do rádio. Pesquisa estações de rádio, selecionando rapidamente as estações identificadas recentemente e alternando entre as bandas de rádio. Os componentes da interface 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 direção do carro. Para a UX de login e configurações das fontes de mídia, em que a tela é controlada diretamente pelas fontes de mídia, esse serviço garante que nenhum conteúdo inseguro seja exibido quando o carro estiver em movimento. Os OEMs podem personalizar a definição desses estados e como o sistema reage nessas situações (por exemplo, mostrando uma sobreposição de tela de bloqueio). |
Fluxos de usuário
Inicialização do app de mídia
O processo que inicia o app de mídia aparece abaixo.
Figura 2. Inicialização do app de mídia
A mídia precisa ser iniciada usando o seguinte CAR_INTENT_ACTION_MEDIA_TEMPLATE
implícito.
Essa intent 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 umMediaBrowserService
no app de mídia ao qual a mídia vai se conectar. Se não for fornecido, o app de mídia vai mostrar o app de mídia selecionado. Essa intent é usada nos seguintes pontos de entrada:-
Interface do sistema. Usado para retornar à experiência de mídia ou para começar a usá-la pela primeira vez. Nesse caso, a intent acima seria usada sem nenhum extra para fazer com que a mídia mostrasse o app de mídia selecionado.
-
Tela inicial, assistentes e centro de notificações. Os usuários podem navegar até "Mídia" para mostrar o app de mídia selecionado. Em todos os casos, a intent implícita sem extras é acionada.
-
Acesso rápido aos apps. Quando os usuários selecionam um app de mídia no App Launcher, a intent acima inclui o extra
CAR_EXTRA_MEDIA_COMPONENT
, que contém o app de mídia selecionado. A mídia designa isso como o app recém-selecionado e se conecta a ele. Para mais detalhes, consulte a seção abaixo, "Integração do App Launcher à mídia".
-
Integração do acesso rápido aos apps com a mídia
Os apps de mídia não podem fornecer nenhuma atividade anotada com a
categoria android.intent.category.LAUNCHER
. Como resultado, o App Authenticator (ou equivalente) precisa implementar uma lógica especial para lidar com a integração da fonte de mídia:
-
O iniciador de apps precisa verificar o sistema em busca de pacotes que implementam
MediaBrowserService.SERVICE_INTERFACE
. Para esses pacotes, a tela de início do app busca o ícone do serviço de forma semelhante à usada para buscar outras atividades. -
O App Launcher combina esses pacotes com aqueles que implementam atividades
android.intent.category.LAUNCHER
. Se um app fornecer uma implementação deMediaBrowserService
e uma atividade de tela de início, o serviço terá precedência.No momento em que este artigo foi escrito, nenhum app de fonte de mídia podia fornecer uma atividade de tela de início.
- Um exemplo dessa lógica pode ser encontrado no código do AOSP em
AppLauncherUtils#getAllLauncherApps()
.
Fluxo de login e opções de configuração
Os apps de mídia podem incluir uma atividade de configurações otimizada para veículos. Essa atividade pode ser usada para implementar fluxos de usuários não abordados pelas APIs Media do Android, por exemplo:
- Login
- Sair
- Alternância de contas
- Mostra em qual página o usuário está conectado (se houver)
- Configuração do serviço
Figura 3. Fluxo de login
Essa atividade de configurações é declarada pelo app de mídia com o seguinte filtro de intent:
<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 precisa implementar a seguinte lógica:
-
Verifique se o app de mídia selecionado atualmente inclui uma atividade com o filtro de intent fornecido.
-
Se sim, permita que o usuário navegue até a atividade.
-
Se as restrições de experiência do usuário do carro estiverem em vigor (por exemplo, o carro estiver em movimento), essa característica será desativada, porque a atividade de configurações não é uma interface otimizada para o motorista.
Tratamento de erros e login obrigatório
A mídia interage com os apps de mídia pela API Media Session do Android. Como parte dessa
API, a mídia recebe um objeto
PlaybackState
, que comunica o estado atual do app de mídia.
O processo de login começa quando o app de mídia muda de
PlaybackState
para
STATE_ERROR
,
incluindo um código de erro específico (confira os detalhes abaixo). Quando isso
acontece, a mídia mostra a descrição do erro e uma capacidade de navegar para uma atividade de login
implementada pelo app de mídia.
Esse mesmo fluxo pode ser usado por apps para sinalizar outras situações de erro (por exemplo, um erro de conectividade do servidor).
Figura 4. Tratamento de erros
Como parte do processamento normal de erros PlaybackState
, a mídia precisa verificar a seguinte entrada.
-
Código de erro
PlaybackState
igual aPlaybackStateCompat#ERROR_CODE_AUTHENTICATION_EXPIRED
. Isso indica que o app de mídia exige 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 apps de mídia usando o métodoPlaybackStateCompat.Builder#setErrorMessage
) contém uma explicação legível por humanos (por exemplo, "Você não fez login"). Essa mensagem precisa ser exibida ao usuário e precisa estar otimizada para distração ao dirigir (DO, na sigla em inglês). -
Opcionalmente,
PlaybackState
pode incluir os seguintes extras (definidos por apps de mídia com o métodoPlaybackStateCompat.Builder#setExtras
) com as seguintes chaves.-
android.media.extras.ERROR_RESOLUTION_ACTION_LABEL
. Definido como uma string que contém a mensagem legível por humanos para ser exibida no botão tocado pelo usuário para iniciar o fluxo de login. -
android.media.extras.ERROR_RESOLUTION_ACTION_INTENT
. Defina com umPendingIntent
para ser acionado quando o usuário clicar no botão mencionado acima. EssePendingIntent
aponta para uma atividade de login personalizada implementada pelo mesmo app de mídia.
-
-
O estado
PlaybackState
é igual aSTATE_ERROR
. Isso indica que nenhuma outra operação é possível até que o login seja concluído.