空間認識機能は、ユーザーがアプリやシステムを操作する際に変更される可能性があります。また、アプリ自体によって変更されることもあります(ホーム スペースやフル スペースへの移動など)。問題を回避するには、アプリで空間機能をチェックして、現在の環境でサポートされている API を特定する必要があります。
XR 向け Jetpack Compose を使用して空間機能を確認する
XR 用の Jetpack Compose は、空間機能をチェックするための 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 ライブラリを使用する場合は、セッションを作成する必要があります。セッションが作成されたら、セッションで getSpatialCapabilities
を呼び出して、現在使用可能な空間機能のクエリを実行します。
SPATIAL_CAPABILITY_3D_CONTENT
: アクティビティで 3D コンテンツを作成できます。SPATIAL_CAPABILITY_APP_ENVIRONMENT
: アクティビティは独自の環境を設定できます。SPATIAL_CAPABILITY_EMBED_ACTIVITY
: アクティビティに別のアクティビティを空間的に埋め込むことができます。SPATIAL_CAPABILITY_PASSTHROUGH_CONTROL
: アクティビティでパススルーを有効または無効にできます。SPATIAL_CAPABILITY_SPATIAL_AUDIO
: アクティビティで空間オーディオを使用できます。SPATIAL_CAPABILITY_UI
: アクティビティは、空間パネルの追加など、自身を空間化できます。
空間機能が変更されたときに通知するコールバック addSpatialCapabilitiesChangedListener
をサブスクライブすることもできます。
val xrSession = Session.create(this)
// 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)) {
// ...
}
// Example 3: Create a spatialized panel if/when spatialization UI becomes available
xrSession.addSpatialCapabilitiesChangedListener((capabilities) -> {
if (capabilities.hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_UI)){
Subspace{
SpatialPanel(...)
}
}
});