Informazioni sul routing dell'input fisico per gli occhiali audio

Dispositivi XR applicabili
Queste indicazioni ti aiutano a creare esperienze per questi tipi di dispositivi XR.
Occhiali audio

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à:

  1. Crea un pending intent: crea un Intent esplicito che rimandi all'attività proiettata di destinazione. Aggrega l'intent in un PendingIntent e imposta FLAG_UPDATE_CURRENT o FLAG_IMMUTABLE per 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
        )
    }

  2. Registra il ricevitore di input: ottieni un'istanza di ProjectedActivityCompat e registra il tuo PendingIntent come ricevitore di input designato passandolo a setActivityAsInputReceiver.

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

  3. 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 PendingIntent obsoleti 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.

Figura 1. Come viene indirizzato lo stato attivo dell'input per un'app di navigazione in questo scenario non simultaneo.
  1. L'utente avvia la navigazione senza musica di sottofondo.
  2. L'app di navigazione avvia l'attività proiettata sugli occhiali audio.
  3. Poiché non è attiva alcuna sessione multimediale, l'app di navigazione mantiene lo stato attivo dell'input del touchpad per tutto il percorso.
  4. 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.

Figura 2. Come viene indirizzato lo stato attivo dell'input per un'app di navigazione in questo scenario semi-contemporaneo.
  1. L'utente avvia la navigazione mentre la musica in background è in pausa.
  2. Durante i periodi di silenzio tra le letture, lo stato attivo dell'input viene impostato per impostazione predefinita sui controlli multimediali.
  3. Quando l'app di navigazione dice "Tra 150 metri, gira a sinistra", acquisisce lo stato attivo dell'input.
  4. 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.

Figura 3. Come verrebbe indirizzato lo stato attivo dell'input per un'app di navigazione in questo scenario simultaneo.
  1. L'utente avvia la navigazione mentre la musica è in riproduzione.
  2. Durante la lettura delle istruzioni, il sistema abbassa l'audio di sottofondo e sposta lo stato attivo dell'input sull'app di navigazione.
  3. 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).