Em óculos com áudio, o sistema roteia a entrada física (como gestos no touchpad ou pressionamentos de botão) com base na percepção do usuário, e não no foco da tela visual. Como os usuários não podem ver uma interface do usuário, o sistema encaminha a entrada física para a atividade projetada de qualquer experiência no app que o usuário esteja detectando ou com que esteja interagindo ativamente.
Como o sistema determina o reconhecimento do usuário
O sistema determina a percepção do usuário monitorando quais dos seguintes fluxos de dados estão ativos:
- Fluxos de saída de áudio: leituras de voz, dicas de áudio ou reprodução de mídia.
- Fluxos de gravação do microfone: comandos de voz ou captura de áudio em andamento do ambiente do usuário.
- Fluxos de captura de câmera: fluxos de vídeo ou foto.
Alguns fluxos de dados são temporários e só mantêm a atenção do usuário por um curto período. Por exemplo, uma leitura de áudio da próxima curva que um usuário deve fazer ao navegar por uma rota. Outros fluxos de dados são indefinidos e mantêm o reconhecimento do usuário enquanto continuarem. Por exemplo, reprodução de mídia com uma playlist infinita e aleatória. Quando um fluxo de dados temporário interrompe um fluxo de dados indefinido, ele ganha temporariamente a atenção do usuário.
Simultaneidade e foco de entrada
Os usuários costumam executar várias experiências no app ao mesmo tempo em óculos com áudio. Por exemplo, um usuário pode ouvir música enquanto segue a navegação guiada. Nesses casos, o sistema atribui um estado de simultaneidade e muda o foco de entrada para corresponder ao foco de áudio, fazendo o seguinte:
- Retomar ou interromper a atividade projetada do app.
- Encaminhamento de entrada física para a atividade projetada em primeiro plano.
Essa abordagem ajuda a manter uma experiência consistente para o usuário.
Permitir que o sistema reinicie a atividade projetada
Quando o app ganha a atenção do usuário, especialmente se a atividade projetada estava em segundo plano, o sistema precisa ser capaz de retomar a atividade e rotear a entrada física para ela.
Para garantir que o sistema possa reiniciar sua atividade:
Criar uma intent pendente: crie uma
Intentexplícita que aponte para a atividade projetada de destino. Envolva a intent em umaPendingIntente definaFLAG_UPDATE_CURRENTouFLAG_IMMUTABLEpara manter um comportamento de inicialização seguro e previsível:// Build an explicit Intent pointing to this projected activity and wrap it in a // PendingIntent so the system can relaunch it and route physical input to it. private val pendingIntent: PendingIntent by lazy { val intent = Intent(this, ProjectedInputFocusActivity::class.java) PendingIntent.getActivity( this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE ) }
Registrar o receptor de entrada: receba uma instância de
ProjectedActivityCompate registre seuPendingIntentcomo o receptor de entrada designado transmitindo-o parasetActivityAsInputReceiver.override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) lifecycleScope.launch { // Create or obtain the ProjectedActivityCompat instance val projectedActivity = ProjectedActivityCompat.create(this@ProjectedInputFocusActivity) // Register the PendingIntent as the designated input receiver projectedActivity.setActivityAsInputReceiver(pendingIntent) }
Limpar o receptor de entrada na limpeza: quando a atividade for destruída ou não precisar mais receber entrada física, limpe o receptor de entrada para evitar envios de
PendingIntentdesatualizados e vazamentos de memória.override fun onDestroy() { super.onDestroy() lifecycleScope.launch { val projectedActivity = ProjectedActivityCompat.create(this@ProjectedInputFocusActivity) projectedActivity.clearActivityAsInputReceiver() } }
Entender como o foco de entrada muda entre os estados de simultaneidade
Para determinar qual app recebe o foco de entrada, o sistema avalia os fluxos de dados ativos e encaminha a entrada com base nestes estados de simultaneidade:
| Estado de simultaneidade | Contexto ambiental | Comportamento do sistema e foco de entrada | Exemplo |
|---|---|---|---|
Não simultâneo |
Uma atividade projetada independente está ativa, sem sessão de mídia em segundo plano em execução. |
O foco de entrada é direcionado inteiramente para a atividade projetada, mesmo durante períodos de silêncio entre as leituras. |
Um usuário executa um app de monitoramento de treinos. Mesmo durante momentos de silêncio, as entradas do touchpad são encaminhadas diretamente para o app de fitness. |
Semiconcorrente |
Uma atividade projetada está ativa, mas há uma sessão de mídia em segundo plano pausada. |
O foco de entrada é definido por padrão para os controles de mídia pausados durante os períodos de silêncio entre as leituras ativas do app. |
Um usuário executa um app de monitoramento de treinos enquanto a música está pausada. Entre as atualizações do treinador, um toque no touchpad retoma a música em vez de acionar uma função de treino. |
Simultâneo |
A reprodução dupla está ativa (por exemplo, o anúncio de áudio do app interrompe ou diminui o volume da música de fundo). |
O foco de áudio é igual ao foco de entrada. O foco de entrada é direcionado para a atividade projetada durante as leituras ativas e volta para os controles de mídia quando o stream de áudio termina. |
Um usuário está ouvindo música quando um app de navegação inicia uma leitura de instruções. Durante a leitura, o app de navegação recebe o foco de entrada. Depois que a leitura termina, o foco de entrada volta para os controles de mídia. |
Proteções de tempo do sistema
O sistema oferece as seguintes proteções para ajudar a evitar entradas acidentais ou comportamentos inesperados para os usuários:
- Períodos de carência para atividades projetadas recém-lançadas: para acomodar o carregamento de recursos de inicialização a frio ou atrasos de rede, as atividades projetadas recém-lançadas recebem um breve período de carência para estabelecer um fluxo de dados e ganhar a atenção do usuário antes que o sistema interrompa a atividade projetada e a mova para o segundo plano.
- O foco é roteado com base na percepção do usuário: se a percepção do usuário mudar de um fluxo de dados novo e ativo, como uma leitura de áudio, o sistema retoma instantaneamente a atividade projetada e roteia o foco de entrada para ela.
- Buffers de transição durante a reprodução de mídia: quando uma leitura temporária é concluída durante a reprodução de mídia em segundo plano, o foco de entrada permanece na atividade projetada momentaneamente. O período de buffer ajuda a evitar entradas acidentais, como um usuário que tenta silenciar a leitura, mas pula uma faixa de música. Após o buffer de transição, o sistema interrompe a atividade projetada do app e direciona o foco de entrada para os controles de mídia.
- As atividades projetadas inativas são interrompidas ou pausadas: o sistema interrompe todas as atividades projetadas inativas sem streams de dados ativos após alguns minutos (ou momentaneamente para a saída de mídia em andamento quando pausada).
Transições de foco de entrada na prática
Para entender como o foco de entrada faz a transição entre os estados de simultaneidade, considere os seguintes cenários de exemplo para um app de navegação que oferece navegação guiada:
Cenário A: não simultâneo (mídia inativa)
Nesse cenário, o sistema encaminha a entrada para o app de navegação, que tem reconhecimento do usuário durante todo o trajeto.
- O usuário inicia a navegação sem música de fundo.
- O app de navegação inicia a atividade projetada nos óculos com áudio.
- Como nenhuma sessão de mídia está ativa, o app de navegação mantém o foco de entrada do touchpad durante todo o trajeto.
- Ações do usuário: tocar durante uma leitura ativa pode silenciar as orientações. Tocar durante o silêncio pode repetir a última instrução.
Cenário B: semisimultâneo (mídia pausada)
Nesse cenário, o sistema encaminha a entrada para os controles de mídia do sistema sempre que o app de navegação não tem reconhecimento do usuário.
- O usuário inicia a navegação enquanto a música de fundo está pausada.
- Durante os períodos de silêncio entre as leituras, o foco de entrada é padronizado para os controles de mídia.
- Quando o app de navegação diz "Em 150 metros, vire à esquerda", ele ganha o foco de entrada.
- Ações do usuário: tocar durante a leitura pode silenciar as instruções. Tocar durante o silêncio retoma a reprodução da música.
Cenário C: simultâneo (mídia ativa)
Nesse cenário, o sistema encaminha a entrada para os controles de mídia do sistema sempre que o app de navegação não tem reconhecimento do usuário, e o áudio da reprodução de mídia ativa é reduzido durante cada leitura do app de navegação.
- O usuário inicia a navegação enquanto uma música está tocando.
- Durante a leitura de uma instrução, o sistema reduz o áudio em segundo plano e muda o foco de entrada para o app de navegação.
- Ações do usuário: tocar durante a leitura pode silenciar as instruções. Tocar durante períodos de silêncio controla a reprodução de mídia (para pausar ou retomar).