Sugli occhiali audio, il sistema indirizza l'input fisico (ad esempio i gesti sul touchpad o la pressione dei pulsanti) in base alla consapevolezza dell'utente anziché allo stato attivo del display visivo. Poiché gli utenti non possono vedere un'interfaccia utente, il sistema indirizza l'input fisico all'attività proiettata di qualsiasi esperienza con l'app che l'utente sta percependo o con cui sta interagendo attivamente.
In che modo il sistema determina l'awareness degli utenti
Il sistema determina l'awareness dell'utente monitorando quali dei seguenti stream di dati sono attivi:
- Stream di output audio: letture vocali, segnali audio o riproduzione di contenuti multimediali.
- Stream di registrazione del microfono: comandi vocali o acquisizione audio in corso dall'ambiente circostante di un utente.
- Stream di acquisizione della fotocamera: stream di video o foto.
Alcuni stream di dati sono temporanei e mantengono l'attenzione degli utenti solo per un breve periodo di tempo. Ad esempio, una lettura audio della svolta successiva che un utente deve fare durante la navigazione di un percorso. Altri stream di dati sono indefiniti e mantengono l'awareness degli utenti per tutta la loro durata. Ad esempio, la riproduzione di contenuti multimediali con una playlist infinita e casuale. Quando un flusso di dati temporaneo interrompe un flusso di dati indefinito, l'utente ne viene temporaneamente informato.
Contemporaneità e focus dell'input
Gli utenti spesso eseguono più esperienze con le app contemporaneamente sugli occhiali audio. Ad esempio, un utente potrebbe ascoltare musica mentre segue la navigazione passo passo. In questi casi, il sistema assegna uno stato di contemporaneità e sposta lo stato attivo dell'input in modo che corrisponda allo stato attivo dell'audio eseguendo le seguenti operazioni:
- Riprendere o interrompere l'attività prevista dell'app.
- Routing dell'input fisico all'attività proiettata in primo piano.
Questo approccio contribuisce a mantenere un'esperienza utente coerente.
Consenti al sistema di riavviare l'attività proiettata
Quando la tua app acquisisce l'awareness dell'utente, soprattutto se l'attività proiettata era in background, il sistema deve essere in grado di riprendere l'attività e indirizzare l'input fisico verso di essa.
Per assicurarti che il sistema possa riavviare la tua attività:
Crea un pending intent: crea un
Intentesplicito che rimandi all'attività proiettata di destinazione. Aggrega l'intent in unPendingIntente impostaFLAG_UPDATE_CURRENToFLAG_IMMUTABLEper mantenere un comportamento di lancio sicuro e prevedibile:// 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 ) }
Registra il ricevitore di input: ottieni un'istanza di
ProjectedActivityCompate registra il tuoPendingIntentcome ricevitore di input designato passandolo asetActivityAsInputReceiver.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) }
Cancella il ricevitore di input durante la pulizia: quando l'attività viene eliminata o non deve più ricevere input fisici, cancella il ricevitore di input per evitare invii di
PendingIntentobsoleti e perdite di memoria.override fun onDestroy() { super.onDestroy() lifecycleScope.launch { val projectedActivity = ProjectedActivityCompat.create(this@ProjectedInputFocusActivity) projectedActivity.clearActivityAsInputReceiver() } }
Comprendere come lo stato attivo dell'input si sposta tra gli stati di contemporaneità
Per determinare quale app riceve lo stato attivo dell'input, il sistema valuta gli stream di dati attivi e indirizza l'input in base a questi stati di concorrenza:
| Stato della concorrenza | Contesto ambientale | Comportamento del sistema e stato attivo dell'input | Esempio |
|---|---|---|---|
Non simultanei |
È attiva un'attività proiettata autonoma; non è in esecuzione alcuna sessione multimediale in background. |
Lo stato attivo dell'input viene indirizzato interamente all'attività proiettata, anche durante i periodi di silenzio tra le letture. |
Un utente esegue un'app di monitoraggio dell'allenamento. Anche durante i momenti di silenzio, gli input del touchpad vengono indirizzati direttamente all'app di fitness. |
Semi-contemporaneo |
Un'attività proiettata è attiva, ma esiste una sessione multimediale in background in stato di pausa. |
Per impostazione predefinita, lo stato attivo dell'input è impostato sui controlli multimediali in pausa durante i periodi di silenzio tra le letture attive dell'app. |
Un utente esegue un'app di monitoraggio dell'allenamento mentre la musica è in pausa. Tra un aggiornamento del coach di fitness e l'altro, un tocco sul touchpad riprende la musica anziché attivare una funzione di allenamento. |
Contemporaneamente |
La riproduzione doppia è attiva (ad esempio, l'annuncio audio della tua app interrompe o abbassa la musica di sottofondo). |
Il focus audio corrisponde al focus di input. Lo stato attivo dell'input viene indirizzato all'attività proiettata durante le letture attive e torna ai controlli multimediali al termine dello stream audio. |
Un utente ascolta musica quando un'app di navigazione attiva la lettura delle istruzioni. Durante la lettura, l'app di navigazione riceve lo stato attivo. Al termine della lettura, lo stato attivo dell'input torna ai controlli multimediali. |
Misure di sicurezza per la sincronizzazione del sistema
Il sistema fornisce le seguenti misure di protezione per evitare input accidentali o comportamenti imprevisti per gli utenti:
- Periodi di tolleranza per le attività proiettate appena avviate: per consentire il caricamento degli asset con cold start o i ritardi di rete, le attività proiettate appena avviate ricevono un breve periodo di tolleranza per stabilire un flusso di dati e ottenere l'attenzione dell'utente prima che il sistema interrompa l'attività proiettata e la sposti in background.
- Lo stato attivo viene indirizzato in base alla consapevolezza dell'utente: se la consapevolezza dell'utente cambia da un nuovo stream di dati attivo, ad esempio una lettura audio, il sistema riprende immediatamente l'attività proiettata e indirizza lo stato attivo dell'input verso di essa.
- Buffer di transizione durante la riproduzione di contenuti multimediali: quando una lettura temporanea viene completata durante la riproduzione di contenuti multimediali in background, lo stato attivo dell'input rimane momentaneamente sull'attività proiettata. Il periodo di buffer aiuta a prevenire input accidentali, ad esempio un utente che tenta di disattivare l'audio della lettura, ma salta una traccia musicale. Dopo il buffer di transizione, il sistema interrompe l'attività proiettata dell'app e indirizza lo stato attivo dell'input ai controlli multimediali.
- Le attività proiettate inattive vengono interrotte o messe in pausa: il sistema interrompe tutte le attività proiettate inattive senza stream di dati attivi dopo un paio di minuti (o momentaneamente per l'output multimediale in corso quando è in pausa).
Transizioni dello stato attivo dell'input in pratica
Per capire come lo stato attivo dell'input passa da uno stato di contemporaneità all'altro, considera i seguenti scenari di esempio per un'app di navigazione che fornisce indicazioni stradali passo passo:
Scenario A: non simultaneo (media non attivo)
In questo scenario, il sistema indirizza l'input all'app di navigazione, che ha l'awareness dell'utente durante l'intero percorso.
- L'utente avvia la navigazione senza musica di sottofondo.
- L'app di navigazione avvia l'attività proiettata sugli occhiali audio.
- Poiché non è attiva alcuna sessione multimediale, l'app di navigazione mantiene lo stato attivo dell'input del touchpad per tutto il percorso.
- Azioni dell'utente: toccare lo schermo durante una lettura attiva potrebbe disattivare l'audio delle indicazioni. Se tocchi durante il silenzio, potrebbe essere ripetuta l'ultima istruzione.
Scenario B: semi-contemporaneo (contenuti multimediali in pausa)
In questo scenario, il sistema indirizza l'input ai controlli multimediali di sistema ogni volta che l'app di navigazione non ha l'awareness dell'utente.
- L'utente avvia la navigazione mentre la musica in background è in pausa.
- Durante i periodi di silenzio tra le letture, lo stato attivo dell'input viene impostato per impostazione predefinita sui controlli multimediali.
- Quando l'app di navigazione dice "Tra 150 metri, gira a sinistra", acquisisce lo stato attivo dell'input.
- Azioni dell'utente: toccare durante la lettura potrebbe disattivare l'audio delle indicazioni. Se tocchi durante il silenzio, la riproduzione della musica riprende.
Scenario C: contemporaneo (media attivo)
In questo scenario, il sistema indirizza l'input ai controlli multimediali di sistema ogni volta che l'app di navigazione non ha l'awareness dell'utente e l'audio della riproduzione multimediale attiva viene attenuato durante ogni lettura dell'app di navigazione.
- L'utente avvia la navigazione mentre la musica è in riproduzione.
- Durante la lettura delle istruzioni, il sistema abbassa l'audio di sottofondo e sposta lo stato attivo dell'input sull'app di navigazione.
- Azioni dell'utente: toccare lo schermo durante la lettura potrebbe disattivare l'audio delle indicazioni. Se tocchi durante i periodi di silenzio, controlli la riproduzione dei contenuti multimediali (per metterli in pausa o riprenderli).