不同類型的語音眼鏡和顯示型眼鏡具備不同功能。規劃如何支援不同類型的 AI 裝置後,您可以在執行階段檢查裝置功能,為使用者的裝置提供最佳體驗。
檢查裝置是否有螢幕
顯示型眼鏡可顯示使用 Jetpack Compose Glimmer 建構的使用者介面。以下範例說明如何檢查智慧眼鏡裝置是否有螢幕:
// Check device capabilities val projectedDeviceController = ProjectedDeviceController.create(this@ProjectedMainActivity) isVisualUiSupported = projectedDeviceController.capabilities.contains(CAPABILITY_VISUAL_UI)
回應螢幕狀態變更
在顯示型眼鏡上,螢幕可能會逾時,或使用者可以關閉螢幕。如要設計無論螢幕開啟或關閉都能執行的活動,請使用 addPresentationModeChangedListener,在螢幕狀態變更時接收通知。您可以根據螢幕狀態,調整活動的音訊資訊量。
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) }