空间功能可能会随着用户与您的应用或系统互动而发生变化,甚至可能会由您的应用本身更改(例如,进入 Home Space 或 Full Space)。为避免问题,您的应用需要检查空间功能,以确定当前环境支持哪些 API。
使用 Jetpack Compose for XR 检查空间功能
Jetpack Compose for XR 会创建一个 Composition Local 来检查空间功能。您可以使用此命令检查是否已启用空间界面、空间音频、环境、透传或 3D 内容。
您可以使用 LocalSpatialCapabilities.current
检查以下空间功能目前是否可用:
isSpatialUiEnabled
:指示应用是否可以创建空间界面元素(例如SpatialPanel
)。isContent3dEnabled
:指示应用是否可以创建 3D 对象。isAppEnvironmentEnabled
:指示应用是否可以设置环境。isPassthroughControlEnabled
:指示应用是否可以控制透传状态。isSpatialAudioEnabled
:指示应用是否可以使用空间音频。
以下示例展示了如何检查是否已启用空间界面:
if (LocalSpatialCapabilities.current.isSpatialUiEnabled) { Subspace { SpatialPanel( modifier = SubspaceModifier .width(1488.dp) .fillMaxHeight() ) { AppContent() } } } else { AppContent() }
使用 SceneCore 检查空间功能
使用 SceneCore 库时,您必须创建一个会话。创建会话后,对会话调用 getSpatialCapabilities
以查询当前可用的空间功能。
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.getSpatialCapabilities().hasCapability( SpatialCapabilities.SPATIAL_CAPABILITY_PASSTHROUGH_CONTROL ) ) { xrSession.spatialEnvironment.setPassthroughOpacityPreference(0f) } // Example 2: multiple capability flags can be checked simultaneously: if (xrSession.getSpatialCapabilities().hasCapability( SpatialCapabilities.SPATIAL_CAPABILITY_PASSTHROUGH_CONTROL and SpatialCapabilities.SPATIAL_CAPABILITY_3D_CONTENT ) ) { // ... }