Premiers pas avec OpenXR pour Android XR

Appareils XR concernés
Ces conseils vous aideront à créer des expériences pour ces types d'appareils XR.
Casques XR
Lunettes XR filaires

Avant de commencer à créer avec des extensions OpenXR compatibles ou avec un moteur compatible, consultez la configuration du fichier manifeste et les exigences d'autorisation dans les sections suivantes pour vous assurer que votre application est configurée pour le développement XR.

Configurer le fichier manifeste de votre application

Comme pour les autres projets d'application Android, votre application Android XR doit comporter un fichier AndroidManifest.xml avec des paramètres de fichier manifeste spécifiques. Le fichier manifeste fournit aux outils de compilation Android, au système d'exploitation Android et à Google Play des informations essentielles sur votre application. Pour en savoir plus, consultez le guide de présentation du fichier manifeste d'application.

Pour les applications différenciées XR, votre fichier manifeste doit contenir les éléments et attributs suivants :

Propriété PROPERTY_XR_ACTIVITY_START_MODE

La propriété android:name="android.window.PROPERTY_XR_ACTIVITY_START_MODE" permet au système de savoir qu'une activité doit être lancée dans un mode spécifique lorsqu'elle démarre.

Cette propriété accepte les valeurs suivantes :

  • XR_ACTIVITY_START_MODE_FULL_SPACE_UNMANAGED (OpenXR uniquement)

XR_ACTIVITY_START_MODE_FULL_SPACE_UNMANAGED

Les applications créées avec OpenXR se lancent en mode Full Space et doivent utiliser le mode de démarrage XR_ACTIVITY_START_MODE_FULL_SPACE_UNMANAGED. L'espace complet non géré indique à Android XR que l'application utilise OpenXR.


<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>

La propriété android:name="android.window.PROPERTY_XR_BOUNDARY_TYPE_RECOMMENDED" indique que l'application doit être lancée avec un type de zone de délimitation. Votre application doit spécifier XR_BOUNDARY_TYPE_LARGE si elle est conçue pour permettre aux utilisateurs de se déplacer dans leur espace physique. Si vous spécifiez XR_BOUNDARY_TYPE_NO_RECOMMENDATION, aucune recommandation n'est fournie pour le type de zone de délimitation de sécurité. Le système conserve alors le type déjà utilisé.

<manifest ... >

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

Propriétés du conteneur spatial

Si votre application utilise l'extension XR_EXT_spatial_container (introduite dans le niveau d'API 4 de Spatial) pour présenter du contenu dans des volumes 3D limités ou des panneaux 2D en plus des vues immersives complètes, vous pouvez déclarer les propriétés de fichier manifeste suivantes au niveau <activity> ou <application> pour fournir des indications de lancement à l'environnement d'exécution :

  • org.khronos.openxr.PROPERTY_ACTIVITY_HINT_XR_SPATIAL_CONTAINER_USED_BOUNDS_MODES : spécifie les modes de limites utilisés par l'activité, séparés par |.

    Les valeurs valides sont les suivantes :

    • "2d_panel"
    • "bounded"
    • "immersive"
  • org.khronos.openxr.PROPERTY_ACTIVITY_HINT_XR_SPATIAL_CONTAINER_INITIAL_BOUNDS_MODE : spécifie le mode de limites initial de l'activité lors de son lancement.

    Les valeurs valides sont les suivantes :

    • 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

Les applications OpenXR doivent déclarer l'utilisation de la bibliothèque OpenXR native pour charger correctement son environnement d'exécution. Sans cette déclaration, l'environnement d'exécution ne se charge pas.

<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>

Fonctionnalités PackageManager pour les applications XR

Lorsque vous distribuez des applications via le Google Play Store, vous pouvez spécifier les fonctionnalités matérielles ou logicielles requises dans le fichier manifeste de l'application. L'élément uses-feature permet au Play Store de filtrer de manière appropriée les applications présentées aux utilisateurs.

Les fonctionnalités suivantes sont spécifiques aux applications différenciées pour la XR.

android.software.xr.api.openxr

Les applications qui ciblent la plate-forme Android XR et qui sont créées avec OpenXR ou Unity doivent inclure cette fonctionnalité dans le fichier manifeste de l'application, avec l'attribut android:required défini sur true.

Les applications qui utilisent le package d'extensions Android XR pour Unity version 1.0.0 ou ultérieure ou le package Unity OpenXR: Android XR version 0.5.0-exp.1 ou ultérieure n'ont pas besoin d'ajouter manuellement cet élément au fichier manifeste de l'application. Ces deux packages injecteront cet élément dans le fichier manifeste de l'application pour vous.

Les appareils peuvent spécifier une version pour cette fonctionnalité, qui indique la version la plus récente d'OpenXR compatible avec l'appareil. Les 16 bits supérieurs représentent le nombre principal et les 16 bits inférieurs représentent le nombre mineur. Par exemple, pour spécifier OpenXR version 1.1, la valeur serait définie sur "0x00010001".

Les applications peuvent utiliser la version de la fonctionnalité pour indiquer la version minimale d'OpenXR requise par l'application. Par exemple, si votre application nécessite la compatibilité avec OpenXR 1.1, déclarez la fonctionnalité suivante :

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

android.software.xr.api.spatial

Les applications OpenXR qui nécessitent des extensions introduites dans une version spécifique de l'API Spatial d'Android XR peuvent déclarer la fonctionnalité android.software.xr.api.spatial avec android:version défini sur le niveau d'API Spatial minimal requis (par exemple, "1", "2", "3" ou "4"). Consultez Créer avec des extensions OpenXR compatibles pour vérifier la version de l'API Spatial requise pour chaque extension.

<!-- 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

Cette fonctionnalité indique que l'application nécessite une entrée d'une manette de mouvement 6 DoF (degrés de liberté) de haute précision pour fonctionner correctement. Si votre application est compatible avec les manettes et ne peut pas fonctionner sans elles, définissez la valeur sur true. Si votre application est compatible avec les manettes, mais peut fonctionner sans, définissez la valeur sur 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

Cet indicateur indique que l'application nécessite un suivi des mains haute fidélité pour fonctionner correctement, y compris la position, l'orientation et la vitesse des articulations de la main de l'utilisateur. Si votre application est compatible avec le suivi des mains et ne peut pas fonctionner sans, définissez la valeur sur true. Si votre application est compatible avec le suivi des mains, mais peut fonctionner sans, définissez la valeur sur 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

Cet indicateur indique que l'application nécessite un suivi oculaire haute fidélité pour que la saisie fonctionne correctement. Si votre application est compatible avec le suivi oculaire pour la saisie et ne peut pas fonctionner sans, définissez la valeur sur true. Si votre application est compatible avec le suivi oculaire pour la saisie, mais peut fonctionner sans, définissez la valeur sur 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

Cet indicateur indique que l'application nécessite un matériel de suivi du visage pour fonctionner correctement. Si votre application est compatible avec le suivi du visage et ne peut pas fonctionner sans, définissez la valeur sur true. Si votre application est compatible avec le suivi du visage, mais peut fonctionner sans, définissez la valeur sur 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

Cet indicateur indique que l'application utilise la position GPS précise sur l'appareil, par exemple lorsqu'elle utilise des extensions OpenXR géospatiales (XR_ANDROID_geospatial et XR_ANDROID_geospatial_anchor). Définissez android:required sur true si votre application ne peut pas fonctionner sans matériel GPS, ou sur false si elle peut fonctionner sans.

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

Comprendre les autorisations pour OpenXR

De nombreuses extensions OpenXR accèdent à des données et des fonctionnalités de capteurs sensibles pour la confidentialité. Pour utiliser ces extensions, votre application doit déclarer les éléments <uses-permission> requis dans son fichier AndroidManifest.xml et demander des autorisations dangereuses au moment de l'exécution avant d'appeler les fonctions OpenXR correspondantes.

<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>

Le tableau suivant récapitule les autorisations Android dangereuses requises par les extensions OpenXR compatibles sur Android XR. Pour en savoir plus sur les autorisations XR dans tous les SDK, consultez Comprendre les autorisations pour la réalité XR.

Autorisation

Capacités

Extensions OpenXR

android.permission.EYE_TRACKING_COARSE

Pose, état et orientation des yeux de faible précision (par exemple, pour les avatars).

android.permission.EYE_TRACKING_FINE

Suivi oculaire haute précision pour la sélection, la saisie, les interactions et le rendu fovéal avec suivi oculaire.

android.permission.FACE_TRACKING

Suivre les formes de fusion du visage et afficher les expressions faciales.

android.permission.RECORD_AUDIO

Entrée audio pour les sources de données de suivi du visage basées sur l'audio.

android.permission.HAND_TRACKING

Suivi des positions des articulations de la main, des vitesses, de l'état de visée et de la représentation du maillage de la main.

android.permission.BODY_TRACKING

Suivi des poses des articulations et des proportions du squelette.

android.permission.SCENE_UNDERSTANDING_COARSE

Suivi de plan, suivi d'objet, suivi d'image/de repère/de QR code, ancres, persistance, raycasting sur des éléments traçables, estimation de la lumière et maillages passthrough.

android.permission.SCENE_UNDERSTANDING_FINE

Textures de profondeur, maillage de scène, estimation de la lumière par cubemap, raycasting de profondeur et annotations spatiales.

android.permission.ACCESS_FINE_LOCATION

Position et orientation précises par rapport à la Terre pour le suivi et les ancres géospatiaux.

Étapes suivantes

Maintenant que vous avez terminé de configurer le fichier manifeste de votre application et de consulter les informations importantes, découvrez comment créer des applications avec OpenXR :