Verificar a disponibilidade de dispositivos em tempo de execução para óculos de áudio e óculos de tela

Dispositivos XR relevantes
Estas orientações ajudam você a criar experiências para esses tipos de dispositivos XR.
Óculos de áudio e
display

Ao longo do dia, os óculos de áudio ou de exibição podem perder a conexão com o dispositivo host (como o smartphone do usuário) ou ficar temporariamente indisponíveis se forem removidos. Para considerar esses tipos de mudanças na disponibilidade do dispositivo, o app pode usar a API XR Device Availability, que consolida os indicadores de disponibilidade do dispositivo nos valores padrão do Android Lifecycle.State. Use essa API para ajudar a gerenciar o roteamento de áudio, a ativação por palavra-chave e saber quando esperar a entrada do usuário com base na disponibilidade dos óculos.

Entender os estados do ciclo de vida

A tabela a seguir mostra como os indicadores de disponibilidade do dispositivo são mapeados para os valores de Lifecycle.State.

Estado do ciclo de vida

Status do dispositivo

Descrição

INITIALIZED

Criado

O objeto de ciclo de vida é criado, mas ainda não é observado.

CREATED

Inativo

O serviço está conectado, mas o usuário não está usando o dispositivo.

STARTED

Ativo

O usuário está usando o dispositivo.

DESTROYED

Desconectado

O dispositivo está desconectado ou a conexão de serviço foi perdida.

Verificar e monitorar a disponibilidade de dispositivos

Para verificar e monitorar a disponibilidade de um dispositivo, use um contexto projetado junto com o estado do ciclo de vida para determinar como o app deve lidar com cada 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 */ }
            }
        }
}

Pontos principais sobre o código

  • Verifique uma conexão: antes de acessar o ciclo de vida do dispositivo, chame ProjectedContext.isProjectedDeviceConnected para verificar se o dispositivo projetado está conectado ao dispositivo host.
  • Receba um ProjectedContext: chame ProjectedContext.createProjectedDeviceContext somente depois de verificar a conexão e transmita esse contexto para sua instância XrDevice.
  • Processar a invalidação de contexto: um novo deviceId é gerado sempre que um dispositivo projetado se conecta. Quando o estado atinge DESTROYED, o ProjectedContext atual é inválido. Pare de usar imediatamente e aguarde uma nova conexão.
  • Otimize a bateria e os recursos: processe a funcionalidade do app de maneira adequada com base no estado do ciclo de vida para preservar os recursos do sistema e reduzir o consumo de bateria. Por exemplo, libere recursos específicos dos óculos, como um fluxo de dados da câmera, quando o estado passar de STARTED para CREATED. O estado CREATED indica que o dispositivo não está mais sendo usado. Portanto, é essencial interromper esses processos para evitar o consumo elevado da bateria e promover a privacidade do usuário.