不同类型的无屏眼镜和显示眼镜具有不同的功能。规划好如何支持不同类型的 AI 设备后,您可以在运行时检查设备功能,以便为用户的设备提供最佳体验。
检查设备是否配有显示屏
带屏眼镜可以显示使用 Jetpack Compose Glimmer 构建的界面。以下示例展示了如何检查眼镜设备是否具有显示屏:
// Check device capabilities val projectedDeviceController = ProjectedDeviceController.create(this@ProjectedMainActivity) isVisualUiSupported = projectedDeviceController.capabilities.contains(CAPABILITY_VISUAL_UI)
响应显示状态变化
在有屏幕眼镜上,屏幕可能会超时,或者用户可能会关闭屏幕。如需设计在显示屏开启或关闭时运行的 activity,请使用 addPresentationModeChangedListener,以便在显示状态发生变化时收到通知。您可以根据显示状态调整 activity,以提供适当数量的音频信息。
ProjectedDisplayController.create(activity).addPresentationModeChangedListener {
presentationModeFlags ->
val areVisualsOff = !presentationModeFlags.hasPresentationMode(VISUALS_ON)
}
保持屏幕常亮
在显示眼镜上,您可以使用 addLayoutParamsFlags 请求系统保持屏幕开启并防止屏幕超时。
var projectedDisplayController = ProjectedDisplayController.create(activity)
projectedDisplayController.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
监控电池状态变化
如需跟踪已连接的音频眼镜或显示眼镜的实时电池状态,请使用 ProjectedDeviceController 提供的 addBatteryStateChangedListener 方法。每当电池电量或充电状态发生变化时,此监听器都会通知您的应用,以便您优化应用性能、启用节能模式或更新界面。
@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}") } } }
当您完成对设备的监控或组件被销毁时,请对 ProjectedDeviceController 调用 close,以正确释放底层资源。
@OptIn(ExperimentalProjectedApi::class) override fun onDestroy() { super.onDestroy() // Unregisters the active listeners deviceController?.close() deviceController = null }
您还可以使用 removeBatteryStateChangedListener 在作用域结束之前显式取消注册监听器。
@OptIn(ExperimentalProjectedApi::class) override fun onPause() { super.onPause() // Explicitly unregister the listener when it is no longer needed deviceController?.removeBatteryStateChangedListener(batteryListener) }