Controllare la disponibilità dei dispositivi in fase di runtime per occhiali audio e occhiali con display

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

Durante la giornata, gli occhiali audio o con display di un utente potrebbero perdere la connessione al dispositivo host (ad es. lo smartphone dell'utente) o potrebbero non essere temporaneamente disponibili se l'utente li toglie. Per tenere conto di questi tipi di modifiche alla disponibilità del dispositivo, la tua app può utilizzare l'API XR Device Availability, che consolida i segnali di disponibilità del dispositivo nei valori standard di Android Lifecycle.State. Utilizza questa API per gestire il routing audio, l'attivazione della hotword e per sapere quando prevedere l'input dell'utente in base alla disponibilità degli occhiali.

Informazioni sugli stati del ciclo di vita

La seguente tabella mostra come i segnali di disponibilità del dispositivo vengono mappati ai valori Lifecycle.State.

Stato del ciclo di vita

Stato del dispositivo

Descrizione

INITIALIZED

Creato

L'oggetto del ciclo di vita viene creato, ma non ancora osservato.

CREATED

Non attivo

Il servizio è connesso, ma l'utente non indossa il dispositivo.

STARTED

Attivo

L'utente indossa il dispositivo.

DESTROYED

Disconnesso

Il dispositivo è disconnesso o la connessione al servizio è persa.

Controllare e monitorare la disponibilità del dispositivo

Per controllare e monitorare la disponibilità di un dispositivo, utilizzerai un contesto proiettato insieme allo stato del ciclo di vita per determinare come la tua app deve gestire ogni caso:

    // In your phone activity or service, check for projected device connection state before
    // attempting to create a projected device context and get the device lifecycle.
    ProjectedContext.isProjectedDeviceConnected(context, currentCoroutineContext())
        .flatMapLatest { isConnected ->
            if (isConnected) {
                try {
                    // Create the projected device context on connection
                    val projectedContext = ProjectedContext.createProjectedDeviceContext(context)
                    val xrDevice = XrDevice.getCurrentDevice(projectedContext)

                    // Get the device lifecycle
                    xrDevice.getLifecycle().currentStateFlow
                } catch (e: IllegalStateException) {
                    flowOf(Lifecycle.State.DESTROYED)
                }
            } else {
                flowOf(Lifecycle.State.DESTROYED)
            }
        }
        .collect { state ->
            when (state) {
                Lifecycle.State.STARTED -> { /* Device is available (worn) */ }
                Lifecycle.State.CREATED -> { /* Device is unavailable (not worn) */ }
                Lifecycle.State.DESTROYED -> { /* Device is disconnected from host phone */ }
                else -> { /* Handle other states */ }
            }
        }
}

Punti chiave sul codice

  • Verificare la presenza di una connessione: prima di accedere al ciclo di vita del dispositivo, chiama ProjectedContext.isProjectedDeviceConnected per verificare che il dispositivo proiettato sia connesso al dispositivo host.
  • Ottenere un ProjectedContext: chiama ProjectedContext.createProjectedDeviceContext solo dopo aver verificato la connessione e assicurati di passare questo contesto all'istanza XrDevice.
  • Gestire l'invalidazione del contesto: ogni volta che un dispositivo proiettato si connette, viene generato un nuovo deviceId. Una volta che lo stato raggiunge DESTROYED, l'attuale ProjectedContext non è valido. Smetti di utilizzarlo immediatamente e attendi una nuova connessione.
  • Ottimizzare la batteria e le risorse: gestisci correttamente le funzionalità dell'app in base allo stato del ciclo di vita per preservare le risorse di sistema e ridurre il consumo della batteria. Ad esempio, devi rilasciare le risorse specifiche per gli occhiali, come uno stream di dati della fotocamera, quando lo stato passa da STARTED a CREATED. Lo stato CREATED indica che il dispositivo non viene più indossato, quindi l'interruzione di questi processi è essenziale per evitare un consumo eccessivo della batteria e promuovere la privacy degli utenti.