Componentes do sistema e fluxos de usuários

O diagrama a seguir ilustra os componentes que interagem com a mídia.

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 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.

Lançamento de 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 . 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

Fluxo de entrada

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).

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 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. Este PendingIntent 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.