空间能力会随着用户与应用或系统的交互而改变,甚至可以由应用本身改变——例如,进入 Home Space 或 Full Space。为避免问题,您的应用需要检查空间能力以确定当前环境中支持哪些 API。
使用 Jetpack Compose for XR 检查空间能力
Jetpack Compose for XR 创建了一个 Composition Local 来检查空间能力。使用它来检查是否启用了空间 UI、空间音频、环境、直通或 3D 内容。
您可以使用 LocalSpatialCapabilities.current
来检查以下空间能力当前是否可用
isSpatialUiEnabled
:指示应用是否可以创建空间 UI 元素(例如,SpatialPanel
)。isContent3dEnabled
:指示应用是否可以创建 3D 对象。isAppEnvironmentEnabled
:指示应用是否可以设置环境。isPassthroughControlEnabled
:指示应用是否可以控制直通状态。isSpatialAudioEnabled
:指示应用是否可以使用空间音频。
以下示例展示了如何检查空间 UI 是否已启用
if (LocalSpatialCapabilities.current.isSpatialUiEnabled) { Subspace { SpatialPanel( modifier = SubspaceModifier .width(1488.dp) .fillMaxHeight() ) { AppContent() } } } else { AppContent() }
使用 SceneCore 检查空间能力
使用 SceneCore 库时,您需要创建一个会话。创建会话后,在会话上调用 spatialCapabilities
以查询当前哪些空间能力可用。
SPATIAL_CAPABILITY_3D_CONTENT
:Activity 可以创建 3D 内容。SPATIAL_CAPABILITY_APP_ENVIRONMENT
:Activity 可以设置自己的环境。SPATIAL_CAPABILITY_EMBED_ACTIVITY
:Activity 可以空间嵌入另一个 Activity。SPATIAL_CAPABILITY_PASSTHROUGH_CONTROL
:Activity 可以启用或禁用直通。SPATIAL_CAPABILITY_SPATIAL_AUDIO
:Activity 可以使用空间音频。SPATIAL_CAPABILITY_UI
:Activity 可以空间化自身(例如,添加一个空间面板)。
您还可以选择订阅回调,addSpatialCapabilitiesChangedListener
,它会在空间能力改变时通知您。
// Example 1: check if enabling passthrough mode is allowed if (xrSession.scene.spatialCapabilities.hasCapability( SpatialCapabilities.SPATIAL_CAPABILITY_PASSTHROUGH_CONTROL ) ) { xrSession.scene.spatialEnvironment.setPassthroughOpacityPreference(0f) } // Example 2: multiple capability flags can be checked simultaneously: if (xrSession.scene.spatialCapabilities.hasCapability( SpatialCapabilities.SPATIAL_CAPABILITY_PASSTHROUGH_CONTROL and SpatialCapabilities.SPATIAL_CAPABILITY_3D_CONTENT ) ) { // ... }