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 estão descritos na tabela:

Componente Descrição
Tela inicial Representa outras superfícies na UI do carro que exibem e controlam a mídia atualmente em reprodução. 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 na interface do usuário, como navegar até Mídia.
Assistentes O Android fornece mecanismos para que diferentes aplicativos de assistente de voz interajam com o sistema. Esses aplicativos podem interagir com fontes de mídia em segundo plano (por exemplo, reproduzindo 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 interface do usuário 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 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, depois que os aplicativos são instalados, os usuários são direcionados à mídia para concluir o processo de login ou começar a interagir com o aplicativo.
Gerenciador de sessões de mídia Serviço do sistema Android que rastreia e controla 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 . Mídia e todos os outros aplicativos que exibem a fonte de mídia atualmente em reprodução (por exemplo, a tela inicial), usam o Media Session Manager para detectar esses eventos e atualizar a interface do usuário adequadamente. As fontes de mídia interagem com o Media Session Manager por meio da API Media Session .
Rádio Aplicativo especializado para interagir com o hardware do rádio. O rádio procura estações de rádio, selecionando rapidamente estações identificadas recentemente e alternando entre bandas de rádio. Os componentes de UI 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 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 em 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ários

Lançamento do aplicativo de mídia

O processo que inicia o Media 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 nivelado de um MediaBrowserService no aplicativo de mídia ao qual o Media deve se conectar. Se não for fornecido, Media 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á-la pela primeira vez. Nesse caso, o Intent acima seria usado sem quaisquer extras para fazer com que Media exibisse 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 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 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 este como o aplicativo recém-selecionado e se conecta a ele. Para obter detalhes, consulte a seção abaixo, Iniciador de aplicativos para integração de mídia.

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

Os aplicativos de mídia não têm permissão para fornecer qualquer atividade anotada na categoria android.intent.category.LAUNCHER . Como resultado, o Iniciador de aplicativos (ou equivalente) deve implementar uma lógica especial para abordar a integração da fonte de mídia:

  • O App Launcher 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 de inicialização, o serviço terá precedência.

    No momento em que este livro foi escrito, 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 Android Media, por exemplo:

  • Entrar
  • Sair
  • Troca de conta
  • Exibir em que o usuário está conectado no momento (se houver)
  • Configuração de serviço

Fluxo de login

Figura 3. Fluxo de login

Esta atividade de configurações é declarada pelo aplicativo 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 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.

  • Nesse caso, 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 funcionalidade deverá 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 desta 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 detalhes abaixo). Quando isso acontece, o Media exibe a descrição do erro e uma capacidade para navegar até uma atividade de login implementada pelo aplicativo 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).

Manipulação de erros

Figura 4. Tratamento de erros

Como parte do tratamento normal de erros PlaybackState , a mídia deve verificar a entrada a seguir.

  • Código de erro PlaybackState igual a PlaybackStateCompat#ERROR_CODE_AUTHENTICATION_EXPIRED . Isso sinaliza que o aplicativo 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 aplicativos de mídia usando o método PlaybackStateCompat.Builder#setErrorMessage ) contém 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 distração de direção (DO).

  • 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 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 sinaliza que nenhuma outra operação é possível até que o login seja concluído.