在執行階段檢查音訊眼鏡和螢幕眼鏡的裝置功能

適用的 XR 裝置
本指南可協助您為這類 XR 裝置打造體驗。
音訊和
顯示型眼鏡

不同類型的語音眼鏡和顯示型眼鏡具備不同功能。規劃如何支援不同類型的 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)
}