Android XR 向け OpenXR のスタートガイド

対象となる XR デバイス
このガイダンスは、次のようなタイプの XR デバイス向けのエクスペリエンスを構築する際に役立ちます。
XR ヘッドセット
有線 XR グラス

サポートされている OpenXR 拡張機能またはサポートされているエンジンを使用してビルドを開始する前に、以下のセクションでマニフェスト構成と権限の要件を確認し、アプリが XR 開発用に構成されていることを確認してください。

アプリのマニフェスト ファイルを構成する

他の Android アプリ プロジェクトと同様に、Android XR アプリには特定のマニフェスト設定を含む AndroidManifest.xml ファイルが必要です。マニフェスト ファイルは、アプリに関する重要な情報を Android ビルドツール、Android オペレーティング システム、Google Play に提供します。詳細については、アプリ マニフェストの概要ガイドをご覧ください。

XR 差別化アプリの場合、マニフェスト ファイルに次の要素と属性を含める必要があります。

PROPERTY_XR_ACTIVITY_START_MODE プロパティ

android:name="android.window.PROPERTY_XR_ACTIVITY_START_MODE" プロパティは、アクティビティの開始時に、アクティビティを特定のモードで起動する必要があることをシステムに通知します。

このプロパティには次の値があります。

  • XR_ACTIVITY_START_MODE_FULL_SPACE_UNMANAGED(OpenXR のみ)

XR_ACTIVITY_START_MODE_FULL_SPACE_UNMANAGED

OpenXR で構築されたアプリはフルスペースで起動し、XR_ACTIVITY_START_MODE_FULL_SPACE_UNMANAGED 開始モードを使用する必要があります。管理対象外のフルスペースは、アプリが OpenXR を使用していることを Android XR に通知します。


<manifest ... >

   <application ... >
       <property
           android:name="android.window.PROPERTY_XR_ACTIVITY_START_MODE"
           android:value="XR_ACTIVITY_START_MODE_FULL_SPACE_UNMANAGED" />
       <activity
           android:name="com.example.myapp.MainActivity" ... >

           <intent-filter>
               <action android:name="android.intent.action.MAIN" />

               <category android:name="android.intent.category.LAUNCHER" />
               <category android:name="org.khronos.openxr.intent.category.IMMERSIVE_HMD" />
           </intent-filter>
       </activity>
   </application>
</manifest>

android:name="android.window.PROPERTY_XR_BOUNDARY_TYPE_RECOMMENDED" プロパティは、アプリケーションを特定のタイプの境界で起動する必要があることを示します。ユーザーが物理的な空間を移動できるように設計されている場合は、アプリで XR_BOUNDARY_TYPE_LARGE を指定する必要があります。XR_BOUNDARY_TYPE_NO_RECOMMENDATION を指定すると、安全境界のタイプに関する推奨事項は提供されないため、システムはすでに使用されているタイプを使用します。

<manifest ... >

   <application ... >
       <property
           android:name="android.window.PROPERTY_XR_BOUNDARY_TYPE_RECOMMENDED"
           android:value="XR_BOUNDARY_TYPE_LARGE" />
   </application>
</manifest>

空間コンテナのプロパティ

アプリが XR_EXT_spatial_container 拡張機能(Spatial API レベル 4 で導入)を使用して、完全な没入型ビューに加えて、境界のある 3D ボリュームまたは 2D パネルでコンテンツを表示する場合は、<activity> レベルまたは <application> レベルで次のマニフェスト プロパティを宣言して、ランタイムに起動ヒントを提供できます。

  • org.khronos.openxr.PROPERTY_ACTIVITY_HINT_XR_SPATIAL_CONTAINER_USED_BOUNDS_MODES: アクティビティで使用される境界モードを | で区切って指定します。

    指定できる値は次のとおりです。

    • "2d_panel"
    • "bounded"
    • "immersive"
  • org.khronos.openxr.PROPERTY_ACTIVITY_HINT_XR_SPATIAL_CONTAINER_INITIAL_BOUNDS_MODE: 起動時のアクティビティの初期境界モードを指定します。

    指定できる値は次のとおりです。

    • XR_SPATIAL_CONTAINER_INITIAL_BOUNDS_MODE_BOUNDED
    • XR_SPATIAL_CONTAINER_INITIAL_BOUNDS_MODE_IMMERSIVE
    • XR_SPATIAL_CONTAINER_INITIAL_BOUNDS_MODE_UNDEFINED
<manifest ... >

   <application ... >
       <activity
           android:name="com.example.myapp.MainActivity" ... >
           <property
               android:name="org.khronos.openxr.PROPERTY_ACTIVITY_HINT_XR_SPATIAL_CONTAINER_USED_BOUNDS_MODES"
               android:value="bounded|immersive" />
           <property
               android:name="org.khronos.openxr.PROPERTY_ACTIVITY_HINT_XR_SPATIAL_CONTAINER_INITIAL_BOUNDS_MODE"
               android:value="XR_SPATIAL_CONTAINER_INITIAL_BOUNDS_MODE_BOUNDED" />
       </activity>
   </application>
</manifest>

<uses-native-library> OpenXR

OpenXR アプリケーションは、ランタイムを正常に読み込むために、ネイティブ OpenXR ライブラリの使用を宣言する必要があります。この宣言がないと、ランタイムの読み込みに失敗します。

<manifest ... >

    <application ... >

    <uses-native-library android:name="libopenxr.google.so" android:required="false" />

       <activity
           android:name="com.example.myapp.MainActivity" ... >

           <intent-filter>
               <action android:name="android.intent.action.MAIN" />

               <category android:name="android.intent.category.LAUNCHER" />
           </intent-filter>
        </activity>
    </application>
</manifest>

XR アプリ用の PackageManager 機能

Google Play ストアでアプリを配信する際に、アプリ マニフェストで必要なハードウェア機能やソフトウェア機能を指定できます。uses-feature 要素を使用すると、Google Play ストアでユーザーに表示されるアプリを適切にフィルタできます。

以下の機能は、XR 差別化アプリに固有のものです。

android.software.xr.api.openxr

Android XR プラットフォームを対象とし、OpenXR または Unity でビルドされたアプリは、android:required 属性を true に設定して、アプリ マニフェストにこの機能を含める必要があります。

Android XR Extensions Package for Unity バージョン 1.0.0 以降または Unity OpenXR: Android XR Package バージョン 0.5.0-exp.1 以降を使用するアプリでは、この要素をアプリ マニフェストに手動で追加する必要はありません。この 2 つのパッケージにより、この要素がアプリ マニフェストに挿入されます。

デバイスは、この機能のバージョンを指定できます。これは、デバイスでサポートされている OpenXR の最上位バージョンを示します。上位 16 ビットはメジャー番号を表し、下位 16 ビットはマイナー番号を表します。たとえば、OpenXR バージョン 1.1 を指定するには、値を "0x00010001" に設定します。

アプリは機能バージョンを使用して、アプリが必要とする OpenXR の最小バージョンを示すことができます。たとえば、アプリが OpenXR バージョン 1.1 のサポートを必要とする場合は、次の機能を宣言します。

<uses-feature android:name="android.software.xr.api.openxr"
    android:version="0x00010001"
    android:required="true" />

android.software.xr.api.spatial

特定の Android XR Spatial API バージョンで導入された拡張機能を必要とする OpenXR アプリは、android.software.xr.api.spatial 機能を宣言し、android:version を必要な最小 Spatial API レベル("1"、"2"、"3"、"4" など)に設定できます。各拡張機能に必要な Spatial API バージョンを確認するには、サポートされている OpenXR 拡張機能を使用してビルドするをご覧ください。

<!-- Indicates that the app requires Android XR Spatial API Level 4 or higher. -->
<uses-feature android:name="android.software.xr.api.spatial"
    android:version="4"
    android:required="true" />

android.hardware.xr.input.controller

この機能は、アプリが正しく機能するために、高精度の 6DoF(自由度)モーション コントローラからの入力を必要とすることを示します。アプリがコントローラをサポートしており、コントローラなしでは機能しない場合は、値を true に設定します。アプリがコントローラをサポートしているものの、コントローラなしでも動作する場合は、false に設定します。

<!-- Sets android:required to true, indicating that your app can't function on devices without controllers. -->
<uses-feature android:name="android.hardware.xr.input.controller" android:required="true" />

android.hardware.xr.input.hand_tracking

このフラグは、アプリが正しく機能するために、ユーザーの手の関節の位置、向き、速度など、高精度のハンド トラッキングが必要であることを示します。アプリがハンド トラッキングをサポートしており、ハンド トラッキングなしでは機能しない場合は、値を true に設定します。アプリがハンド トラッキングをサポートしているものの、ハンド トラッキングなしでも動作する場合は、false に設定します。

<!-- Sets android:required to true, indicating that your app can't function on devices without hand tracking. -->
<uses-feature android:name="android.hardware.xr.input.hand_tracking" android:required="true" />

android.hardware.xr.input.eye_tracking

このフラグは、入力が正しく機能するために、アプリが高精度のアイ トラッキングを必要とすることを示します。アプリが入力にアイ トラッキングをサポートしており、アイ トラッキングなしでは機能しない場合は、値を true に設定します。アプリが入力にアイトラッキングをサポートしているものの、アイトラッキングなしでも動作できる場合は、false に設定します。

<!-- Sets android:required to true, indicating that your app can't function on devices without eye tracking. -->
<uses-feature android:name="android.hardware.xr.input.eye_tracking" android:required="true" />

android.hardware.xr.input.face_tracking

このフラグは、アプリが正常に機能するために顔追跡ハードウェアが必要であることを示します。アプリが顔追跡をサポートしており、顔追跡なしでは機能しない場合は、値を true に設定します。アプリが顔追跡をサポートしているものの、顔追跡なしでも動作できる場合は、false に設定します。

<!-- Sets android:required to true, indicating that your app can't function on devices without face tracking. -->
<uses-feature android:name="android.hardware.xr.input.face_tracking" android:required="true" />

android.hardware.location.gps

このフラグは、アプリがデバイス上で正確な GPS 位置情報を使用することを示します。たとえば、地理空間 OpenXR 拡張機能(XR_ANDROID_geospatial と XR_ANDROID_geospatial_anchor)を使用する場合などです。アプリが GPS ハードウェアなしでは機能しない場合は android:required を true に設定し、GPS ハードウェアなしでも動作する場合は false に設定します。

<uses-feature android:name="android.hardware.location.gps" android:required="false" />

OpenXR の権限について

多くの OpenXR 拡張機能は、プライバシーに配慮したセンサーデータや機能にアクセスします。これらの拡張機能を使用するには、アプリの AndroidManifest.xml ファイルで必要な <uses-permission> 要素を宣言し、対応する OpenXR 関数を呼び出す前に実行時に危険な権限をリクエストする必要があります。

<manifest ... >
    <!-- Example dangerous permissions required by specific OpenXR extensions -->
    <uses-permission android:name="android.permission.SCENE_UNDERSTANDING_COARSE" />
    <uses-permission android:name="android.permission.HAND_TRACKING" />
    ...
</manifest>

次の表に、Android XR でサポートされている OpenXR 拡張機能に必要な危険な Android 権限をまとめます。すべての SDK の XR 権限の詳細については、XR の権限についてをご覧ください。

権限

機能

OpenXR 拡張機能

android.permission.EYE_TRACKING_COARSE

低精度の目のポーズ、状態、向き(アバター用など)。

android.permission.EYE_TRACKING_FINE

選択、入力、インタラクション、アイ トラッキングによる中心窩レンダリングのための高精度な視線。

android.permission.FACE_TRACKING

顔のブレンド シェイプをトラッキングし、表情をレンダリングする。

android.permission.RECORD_AUDIO

音声駆動型の顔追跡データソースの音声入力。

android.permission.HAND_TRACKING

手の関節のポーズ、速度、照準状態、手のメッシュ表現をトラッキングします。

android.permission.BODY_TRACKING

体の関節のポーズと骨格の比率をトラッキングする。

android.permission.SCENE_UNDERSTANDING_COARSE

平面トラッキング、オブジェクト トラッキング、画像 / マーカー / QR コード トラッキング、アンカー、永続性、トラッキング可能なオブジェクトに対するレイキャスト、ライト推定、パススルー メッシュ。

android.permission.SCENE_UNDERSTANDING_FINE

深度テクスチャ、シーン メッシュ、キューブマップ ライト推定、深度レイキャスト、空間アノテーション。

android.permission.ACCESS_FINE_LOCATION

Geospatial トラッキングとアンカーのための、地球を基準とした正確な位置と向き。

次のステップ

アプリのマニフェストの構成と重要な情報の確認が完了したら、OpenXR を使用してビルドする方法を確認します。