Comienza a usar OpenXR para Android XR

Dispositivos de realidad extendida correspondientes
Esta guía te ayuda a crear experiencias para estos tipos de dispositivos de realidad extendida.
Visores de realidad extendida
Lentes de realidad extendida con cable

Antes de comenzar a compilar con extensiones de OpenXR compatibles o con un motor compatible, revisa la configuración del manifiesto y los requisitos de permisos en las siguientes secciones para asegurarte de que tu app esté configurada para el desarrollo de XR.

Configura el archivo de manifiesto de tu app

Al igual que con otros proyectos de apps para Android, tu app para Android XR debe tener un archivo AndroidManifest.xml con parámetros de configuración de manifiesto específicos. El archivo de manifiesto describe información esencial sobre tu app para las herramientas de compilación de Android, el sistema operativo Android y Google Play. Para obtener más información, consulta la guía de descripción general del manifiesto de la app.

En el caso de las apps diferenciadas para XR, tu archivo de manifiesto debe contener los siguientes elementos y atributos:

Propiedad PROPERTY_XR_ACTIVITY_START_MODE

La propiedad android:name="android.window.PROPERTY_XR_ACTIVITY_START_MODE" permite que el sistema sepa que se debe iniciar una actividad en un modo específico cuando se inicia la actividad.

Esta propiedad tiene los siguientes valores:

  • XR_ACTIVITY_START_MODE_FULL_SPACE_UNMANAGED (solo OpenXR)

XR_ACTIVITY_START_MODE_FULL_SPACE_UNMANAGED

Las apps compiladas con OpenXR se inician en el espacio completo y deben usar el modo de inicio XR_ACTIVITY_START_MODE_FULL_SPACE_UNMANAGED. El espacio completo no administrado indica a Android XR que la app usa 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 propiedad android:name="android.window.PROPERTY_XR_BOUNDARY_TYPE_RECOMMENDED" indica que la aplicación se debe iniciar con un tipo específico de límite. Tu app debe especificar XR_BOUNDARY_TYPE_LARGE si está diseñada para permitir que los usuarios se muevan por su espacio físico. Especificar XR_BOUNDARY_TYPE_NO_RECOMMENDATION no proporciona recomendaciones para el tipo de límite de seguridad, por lo que el sistema usa el tipo que ya está en uso.

<manifest ... >

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

Propiedades del contenedor espacial

Si tu app usa la extensión XR_EXT_spatial_container (presentada en el nivel de API espacial 4) para mostrar contenido en volúmenes 3D limitados o paneles 2D, además de vistas envolventes completas, puedes declarar las siguientes propiedades del manifiesto en el nivel <activity> o <application> para proporcionar sugerencias de inicio al entorno de ejecución:

  • org.khronos.openxr.PROPERTY_ACTIVITY_HINT_XR_SPATIAL_CONTAINER_USED_BOUNDS_MODES: Especifica los modos de límites que usa la actividad, separados por |.

    Estos son los valores válidos:

    • "2d_panel"
    • "bounded"
    • "immersive"
  • org.khronos.openxr.PROPERTY_ACTIVITY_HINT_XR_SPATIAL_CONTAINER_INITIAL_BOUNDS_MODE: Especifica el modo de límites iniciales de la actividad cuando se inicia.

    Estos son los valores válidos:

    • 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

Las aplicaciones de OpenXR deben declarar el uso de la biblioteca nativa de OpenXR para cargar correctamente su entorno de ejecución. Sin esta declaración, el entorno de ejecución no se carga.

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

Funciones de PackageManager para apps de RE

Cuando distribuyes apps a través de Google Play Store, puedes especificar las funciones de hardware o software necesarias en el manifiesto de la app. El elemento uses-feature permite que Play Store filtre de forma adecuada las apps que se muestran a los usuarios.

Las siguientes funciones son específicas de las apps diferenciadas para XR.

android.software.xr.api.openxr

Las apps que se orientan a la plataforma de Android XR y se compilan con OpenXR o Unity deben incluir esta función en el manifiesto de la app con el atributo android:required establecido en true.

Las apps que usan el paquete de extensiones de Android XR para Unity versión 1.0.0 o posterior, o el paquete de Android XR para Unity OpenXR versión 0.5.0-exp.1 o posterior no tienen que agregar este elemento de forma manual al manifiesto de la app. Estos dos paquetes insertarán este elemento en el manifiesto de la app por ti.

Los dispositivos pueden especificar una versión para esta función, que indica la versión más alta de OpenXR que admite el dispositivo. Los 16 bits superiores representan el número mayor, y los 16 bits inferiores, el número menor. Por ejemplo, para especificar la versión 1.1 de OpenXR, el valor se establecería en "0x00010001".

Las apps pueden usar la versión de la función para indicar una versión mínima de OpenXR que requieren. Por ejemplo, si tu app requiere compatibilidad con OpenXR 1.1, declara la siguiente función:

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

android.software.xr.api.spatial

Las apps de OpenXR que requieren extensiones introducidas en una versión de la API espacial de Android XR específica pueden declarar la función android.software.xr.api.spatial con android:version establecido en el nivel de API espacial mínimo requerido (como "1", "2", "3" o "4"). Consulta Cómo compilar con extensiones de OpenXR compatibles para verificar la versión de la API espacial requerida para cada extensión.

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

Esta función indica que la app requiere la entrada de un controlador de movimiento de alta precisión de 6DoF (grados de libertad) para funcionar correctamente. Si tu app admite controles y no puede funcionar sin ellos, establece el valor en true. Si tu app admite controles, pero puede funcionar sin ellos, configúrala como 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

Esta marca indica que la app requiere un monitoreo de manos de alta fidelidad para funcionar correctamente, lo que incluye la posición, la orientación y la velocidad de las articulaciones de la mano del usuario. Si tu app admite el monitoreo de manos y no puede funcionar sin él, establece el valor en true. Si tu app admite el monitoreo de manos, pero puede funcionar sin él, configúralo como 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

Este indicador señala que la app requiere un seguimiento de ojos de alta fidelidad para que la entrada funcione correctamente. Si tu app admite el seguimiento de ojos para la entrada y no puede funcionar sin él, establece el valor en true. Si tu app admite el seguimiento de ojos para la entrada, pero puede funcionar sin él, establécelo en 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

Esta marca indica que la app requiere hardware de seguimiento facial para funcionar correctamente. Si tu app admite el seguimiento facial y no puede funcionar sin él, establece el valor en true. Si tu app admite el seguimiento facial, pero puede funcionar sin él, configúralo como 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

Esta marca indica que la app usa la ubicación precisa del GPS en el dispositivo, como cuando se usan extensiones geoespaciales de OpenXR (XR_ANDROID_geospatial y XR_ANDROID_geospatial_anchor). Establece android:required en true si tu app no puede funcionar sin hardware de GPS o false si puede funcionar sin él.

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

Información sobre los permisos para OpenXR

Muchas extensiones de OpenXR acceden a datos de sensores y capacidades sensibles para la privacidad. Para usar estas extensiones, tu app debe declarar los elementos <uses-permission> requeridos en su archivo AndroidManifest.xml y solicitar permisos peligrosos en el entorno de ejecución antes de llamar a las funciones de OpenXR correspondientes.

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

En la siguiente tabla, se resumen los permisos peligrosos de Android que requieren las extensiones de OpenXR compatibles en Android XR. Para obtener todos los detalles sobre los permisos de XR en todos los SDKs, consulta Información sobre los permisos para XR.

Permiso

Funciones

Extensiones de OpenXR

android.permission.EYE_TRACKING_COARSE

Pose, estado y orientación de los ojos de baja precisión (como para los avatares)

android.permission.EYE_TRACKING_FINE

Mirada de alta precisión para la selección, la entrada, las interacciones y la renderización foveada con seguimiento de ojos.

android.permission.FACE_TRACKING

Seguimiento de las formas de mezcla faciales y renderización de las expresiones faciales

android.permission.RECORD_AUDIO

Entrada de audio para fuentes de datos de seguimiento facial basadas en audio.

android.permission.HAND_TRACKING

Seguimiento de las poses de las articulaciones de las manos, las velocidades, el estado de apuntado y la representación de la malla de la mano.

android.permission.BODY_TRACKING

Seguimiento de las poses de las articulaciones del cuerpo y las proporciones del esqueleto

android.permission.SCENE_UNDERSTANDING_COARSE

Seguimiento de planos, seguimiento de objetos, seguimiento de imágenes, marcadores y códigos QR, anclajes, persistencia, proyección de rayos contra elementos rastreables, estimación de luz y mallas de transferencia.

android.permission.SCENE_UNDERSTANDING_FINE

Texturas de profundidad, creación de mallas de escenas, estimación de luz de mapa de cubo, trazado de rayos de profundidad y anotaciones espaciales.

android.permission.ACCESS_FINE_LOCATION

Ubicación y orientación precisas en relación con la Tierra para el seguimiento y las anclas geoespaciales.

Próximos pasos

Ahora que terminaste de configurar el manifiesto de tu app y de revisar la información importante, explora las formas en que puedes compilar con OpenXR: