Componentes do sistema e fluxos de usuários

O diagrama a seguir ilustra os componentes que interagem com o Media.

Componentes do sistema

Figura 1. Componentes do sistema

Os elementos desta figura são descritos abaixo:

Componente Descrição
Tela inicial Representa outras superfícies na interface do usuário do carro que exibem e controlam a mídia que está sendo reproduzida no momento. No AOSP, esta é a tela principal exibida quando o sistema inicia. 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 de interface do usuário, como navegar para Mídia.
assistentes O Android fornece mecanismos para diferentes aplicativos de assistente de voz interagirem com o sistema. Esses aplicativos podem interagir com fontes de mídia em segundo plano (por exemplo, reproduzir uma música como resultado de um comando de voz) ou navegar para mídia em primeiro plano (por exemplo, quando um aplicativo de assistente de voz é instruído a exibir a IU de um fonte de mídia específica).
Iniciador de aplicativos Todos os aplicativos Android iniciam no Iniciador de aplicativos, incluindo fontes de mídia. A mídia pode apresentar seu próprio seletor de fonte de mídia, complementando ou substituindo o Iniciador de aplicativos 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, depois que os aplicativos são instalados, os usuários são direcionados para a mídia para concluir o processo de login 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 execução no momento (por exemplo, a tela inicial), usam o Media Session Manager para detectar esses eventos e atualizar a IU 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 da 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 direção do carro. Para o login de fontes de mídia e configurações de 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 de usuário

Lançamento do aplicativo de mídia

O processo pelo qual o Media é iniciado aparece abaixo.

Lançamento do aplicativo de mídia

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 . Esta 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 simplificado de um MediaBrowserService no aplicativo de mídia ao qual o Media deve se conectar. Se não for fornecido, Mídia exibe o aplicativo de mídia atualmente selecionado. 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á-lo pela primeira vez. Nesse caso, o Intent acima seria usado sem nenhum extra para fazer com que a Mídia exiba o aplicativo de mídia atualmente selecionado.

    • Tela inicial, assistentes e central de notificações. Os usuários podem navegar até Mídia para exibir o aplicativo de mídia atualmente selecionado. 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 Iniciador de aplicativos, 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, Iniciador de aplicativo para integração de mídia.

Iniciador de aplicativos para integração de mídia

Aplicativos de mídia não têm permissão para fornecer qualquer atividade anotada com a categoria android.intent.category.LAUNCHER . Como resultado, o Iniciador de aplicativos (ou equivalente) deve implementar uma lógica especial para lidar com 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 Iniciador de aplicativos busca o ícone de serviço semelhante ao usado para buscar outras atividades.

  • O App Launcher então combina esses pacotes com aqueles que implementam as atividades android.intent.category.LAUNCHER . Se um aplicativo fornecer uma implementação MediaBrowserService e uma atividade de iniciador, o serviço terá precedência.

    Até o momento, nenhum aplicativo de fonte de mídia pode fornecer uma atividade de inicialização.

  • 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 veículos. Essa atividade pode ser usada para implementar fluxos de usuários não abordados pelas APIs de mídia do Android, 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

fluxo de sinal-n

Figura 3. Fluxo de login

Esta 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 atualmente selecionado 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 está em movimento), essa funcionalidade deve ser desativada, pois a atividade de configurações não é uma interface de usuário otimizada para 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, o Media exibe a descrição do erro e uma permissão para navegar até uma atividade de entrada implementada pelo aplicativo de mídia.

Este mesmo fluxo pode ser utilizado pelas aplicações para sinalizar outras situações de erro (por exemplo, um erro de conectividade do servidor).

Manipulação de erros

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 a PlaybackStateCompat#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étodo PlaybackStateCompat.Builder#setErrorMessage ) conterá uma explicação legível por humanos (por exemplo, "Você não está conectado."). Esta mensagem deve ser exibida ao usuário e deve ser otimizada para a distração (DO). Para obter detalhes, consulte Restrições de direção do 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 string que contém a mensagem legível por humanos a ser exibida no botão tocado pelo usuário para iniciar o fluxo de login.

    • android.media.extras.ERROR_RESOLUTION_ACTION_INTENT . Definido com um PendingIntent a ser acionado quando o usuário clicar no botão mencionado acima. Este PendingIntent aponta para uma atividade de login personalizada implementada pelo mesmo aplicativo de mídia.

  • O estado PlaybackState é igual a STATE_ERROR . Isso indica que nenhuma outra operação é possível até que o login seja concluído.