Verifica las capacidades del dispositivo en el tiempo de ejecución para los lentes de audio y los lentes de visualización

Dispositivos de realidad extendida correspondientes
Esta guía te ayuda a crear experiencias para estos tipos de dispositivos de realidad extendida.
Lentes con audio y
pantalla

Los diferentes tipos de lentes con audio y lentes con pantalla tienen diferentes capacidades. Después de planificar cómo admitirás diferentes tipos de dispositivos de IA, puedes verificar las capacidades del dispositivo en el entorno de ejecución para proporcionar la mejor experiencia para el dispositivo de un usuario.

Cómo verificar si un dispositivo tiene una pantalla

Los lentes con pantalla pueden mostrar IUs creadas con Jetpack Compose Glimmer. En el siguiente ejemplo, se muestra cómo comprobar si un dispositivo de anteojos tiene una pantalla:

// Check device capabilities
val projectedDeviceController = ProjectedDeviceController.create(this@ProjectedMainActivity)
isVisualUiSupported = projectedDeviceController.capabilities.contains(CAPABILITY_VISUAL_UI)

Cómo reaccionar a los cambios de estado de la pantalla

En los lentes con pantalla, esta puede agotarse o el usuario puede apagarla. Para diseñar actividades que se ejecuten independientemente de si la pantalla está encendida o apagada, usa addPresentationModeChangedListener para recibir notificaciones cuando cambie el estado de la pantalla. Puedes ajustar tu actividad para que proporcione la cantidad adecuada de información de audio según el estado de la pantalla.

ProjectedDisplayController.create(activity).addPresentationModeChangedListener {
    presentationModeFlags ->

    val areVisualsOff = !presentationModeFlags.hasPresentationMode(VISUALS_ON)
}

Mantén la pantalla encendida

En los lentes con pantalla, puedes solicitar que el sistema mantenga la pantalla encendida y evite que se agote el tiempo de espera con addLayoutParamsFlags.

var projectedDisplayController = ProjectedDisplayController.create(activity)

projectedDisplayController.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)

Cómo supervisar los cambios de estado de la batería

Para hacer un seguimiento del estado de la batería en tiempo real de los lentes con pantalla o de audio conectados, usa el método addBatteryStateChangedListener que proporciona ProjectedDeviceController. Este objeto de escucha notifica a tu app cada vez que cambia el nivel de batería o el estado de carga, lo que te permite optimizar el rendimiento de la app, habilitar los modos de ahorro de energía o actualizar la interfaz de usuario.

@OptIn(ExperimentalProjectedApi::class)
private var deviceController: ProjectedDeviceController? = null

private val batteryListener = { batteryState: BatteryState ->
    val batteryLevel = batteryState.batteryLevel
    val isCharging = batteryState.isCharging

    if (batteryLevel <= 15 && !isCharging) {
        switchToLowPowerMode()
    }

    updateBatteryUi(batteryLevel, isCharging)
}
// ...

@OptIn(ExperimentalProjectedApi::class)
private fun monitorBatteryStatus() {
    lifecycleScope.launch {
        try {
            if (deviceController == null) {
                deviceController = ProjectedDeviceController.create(this@PhoneMainActivity)
            }

            if (lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)) {
                deviceController?.addBatteryStateChangedListener(coroutineContext, batteryListener)
            }
        } catch (e: Exception) {
            Log.e("BatteryMonitor", "Unexpected error: ${e.message}")
        }
    }
}

Cuando termines de supervisar el dispositivo o cuando se destruya tu componente, llama a close en ProjectedDeviceController para liberar los recursos subyacentes de forma correcta.

@OptIn(ExperimentalProjectedApi::class)
override fun onDestroy() {
    super.onDestroy()
    // Unregisters the active listeners
    deviceController?.close()
    deviceController = null
}

También puedes cancelar el registro de un objeto de escucha de forma explícita antes de que finalice el alcance con removeBatteryStateChangedListener.

@OptIn(ExperimentalProjectedApi::class)
override fun onPause() {
    super.onPause()
    // Explicitly unregister the listener when it is no longer needed
    deviceController?.removeBatteryStateChangedListener(batteryListener)
}