在运行时检查音频眼镜和显示眼镜的设备功能

适用的 XR 设备
本指南可帮助您为以下类型的 XR 设备打造优质体验。
音频和
显示眼镜

不同类型的无屏眼镜和显示眼镜具有不同的功能。规划好如何支持不同类型的 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)
}