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