Android XR es una extensión de la plataforma y el ecosistema de Android. El SDK de Android XR está diseñado para permitirte compilar apps de XR con herramientas y frameworks conocidos de Android, o bien con estándares abiertos, como OpenXR y WebXR. Todas las apps compatibles para dispositivos móviles o pantallas grandes estarán disponibles para instalar en los auriculares de RE desde Play Store. Revisa las consideraciones de compatibilidad para ver si tu app es compatible.
En esta guía, se explican las siguientes áreas:
- Selecciona tus herramientas y tecnologías de desarrollo
- Diseña apps para Android XR
- Cómo configurar el archivo de manifiesto de tu app
- Consideraciones sobre la compatibilidad del manifiesto de la app
- Información sobre los permisos de Android XR
- Cómo verificar la calidad de las apps para Android XR
- Cómo empaquetar y distribuir tu app para Android XR
Selecciona tus herramientas y tecnologías de desarrollo
Cuando compilas una app para Android XR, puedes elegir entre las siguientes plataformas y tecnologías de desarrollo:
SDK de Jetpack XR
El SDK de XR de Jetpack contiene bibliotecas de Jetpack de Android XR creadas para aprovechar las capacidades únicas de los dispositivos de XR. Comienza con este SDK si deseas realizar alguna de las siguientes acciones:
- Optimizar o mejorar una app existente para teléfonos o tablets Android
- Cómo compilar una nueva app de Android XR con Android Studio y Jetpack
Si ya te sientes cómodo desarrollando con Android Jetpack, el SDK de Jetpack XR es una opción natural para ti. Está diseñado para integrarse sin problemas con esos frameworks y bibliotecas, y te permite usar el conocimiento existente para compilar experiencias de XR inmersivas.
Obtén más información para desarrollar con el SDK de Jetpack XR.
Unity
Unity Engine es un motor de desarrollo 3D en tiempo real que permite a artistas, diseñadores y desarrolladores colaborar para crear experiencias interactivas y envolventes. La compatibilidad de Unity con Android XR te brinda un alto nivel de control sobre las experiencias en 3D que desarrollas, a la vez que te beneficias de la compatibilidad establecida de Unity con OpenXR y su ecosistema de desarrolladores.
Si ya tienes una experiencia de XR creada con Unity o si conoces el desarrollo de Unity, comienza con esta opción.
Obtén más información para desarrollar con Unity para Android XR.
OpenXR
OpenXR es un estándar abierto y sin regalías que se puede usar para crear experiencias de XR multiplataforma y de alto rendimiento. Android XR admite OpenXR 1.0 y 1.1, y estamos expandiendo la especificación con nuevas extensiones para Android XR. Dado que Android XR se basa en estándares abiertos, las herramientas de desarrollo que admiten OpenXR y Android deberían ser compatibles con Android XR.
Obtén más información sobre la compatibilidad con OpenXR para Android XR.
WebXR
WebXR te permite crear experiencias inmersivas para la Web. Proporciona acceso a dispositivos de RV y RA en navegadores web compatibles, como Chrome en Android XR.
Comienza con esta opción si quieres crear una experiencia de XR para la Web o si quieres agregar capacidades de XR a una app web. Las experiencias existentes de WebXR también funcionarán en Android XR.
Obtén más información para crear apps web con WebXR.
Diseño para la RE
La RE expande la superficie de diseño más allá de las pantallas planas tradicionales. Puedes diseñar experiencias envolventes que combinen la realidad física y la virtual. Ya sea que estés creando una experiencia completamente nueva o agregando elementos envolventes a una app existente, la guía de diseño para Android XR puede ayudarte a comenzar.
Cómo configurar 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 específicos del manifiesto. 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, el 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"
le permite al sistema saber que una actividad debe iniciarse en un modo específico cuando se inicia la actividad.
Esta propiedad tiene tres valores posibles:
XR_ACTIVITY_START_MODE_HOME_SPACE
(solo para el SDK de Jetpack XR)XR_ACTIVITY_START_MODE_FULL_SPACE_MANAGED
(solo para el SDK de Jetpack XR)XR_ACTIVITY_START_MODE_FULL_SPACE_UNMANAGED
(solo OpenXR)
XR_ACTIVITY_START_MODE_HOME_SPACE
(Solo para apps compiladas con el SDK de Jetpack XR)
Usa este modo de inicio para abrir tu app en el espacio principal. En el espacio principal, varias apps pueden ejecutarse una al lado de la otra, por lo que los usuarios pueden realizar varias tareas a la vez. Cualquier app para dispositivos móviles o pantallas grandes de Android puede funcionar en el espacio principal, al igual que las apps de XR creadas con el SDK de Jetpack XR.
<manifest ... >
<application ... >
<property
android:name="android.window.PROPERTY_XR_ACTIVITY_START_MODE"
android:value="XR_ACTIVITY_START_MODE_HOME_SPACE" />
<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_ACTIVITY_START_MODE_FULL_SPACE_MANAGED
(Solo para apps compiladas con el SDK de Jetpack XR)
Usa este modo de inicio para abrir tu app en el modo de espacio completo. En el modo de espacio completo, solo se ejecuta una app a la vez, sin límites de espacio, y todas las demás apps están ocultas.
<manifest ... >
<application ... >
<property
android:name="android.window.PROPERTY_XR_ACTIVITY_START_MODE"
android:value="XR_ACTIVITY_START_MODE_FULL_SPACE_MANAGED" />
<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_ACTIVITY_START_MODE_FULL_SPACE_UNMANAGED
(Solo para apps creadas con OpenXR)
Las apps compiladas con OpenXR se inician en el modo de espacio completo y deben usar el modo de inicio XR_ACTIVITY_START_MODE_FULL_SPACE_UNMANAGED
. Full Space 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" />
</intent-filter>
</activity>
</application>
</manifest>
Propiedad PROPERTY_XR_BOUNDARY_TYPE_RECOMMENDED
La propiedad android:name="android.window.PROPERTY_XR_BOUNDARY_TYPE_RECOMMENDED"
indica que la aplicación debe iniciarse 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. Si se especifica XR_BOUNDARY_TYPE_NO_RECOMMENDATION
, no se proporcionan 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>
<uses-native-library> OpenXR
(Solo para apps creadas con OpenXR)
Las aplicaciones de OpenXR deben declarar el uso de la biblioteca nativa de OpenXR para cargar correctamente su tiempo de ejecución. Sin esta declaración, no se podrá cargar el tiempo de ejecución.
<manifest ... >
<application ... >
<uses-native-library andro id: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 requeridas 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.spatial
Las apps compiladas con el SDK de Jetpack XR deben incluir esta función en el manifiesto de la app. El valor que establezcas para el atributo android:required
dependerá del carril de lanzamiento de tu app.
Si tu app incluye funciones o contenido diferenciados para XR en un APK para dispositivos móviles existente y se publica en el segmento de versiones para dispositivos móviles, establece el atributo android:required
en false
:
<!-- If you are publishing an existing mobile APK using the mobile release track, set android:required to false.-->
<uses-feature android:name="android.software.xr.api.spatial" android:required="false" />
Si tu app se creó específicamente para dispositivos compatibles con XR y se publicó en el segmento exclusivo de Android XR, configura el atributo android:required
como true
:
<!-- If you are publishing a separate APK for XR using the dedicated Android XR release track, set android:required to true.-->
<uses-feature android:name="android.software.xr.api.spatial" android:required="true" />
android.software.xr.api.openxr
Las apps que segmentan 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 la versión 1.0.0 o una posterior del paquete de extensiones de Android XR para Unity o la versión 0.5.0-exp.1 o una posterior del paquete de Unity OpenXR: Android XR 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 compatible con el dispositivo. Los 16 bits superiores representan el número principal, y los 16 bits inferiores, el número secundario. 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 requiere la app. 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.hardware.xr.input.controller
Esta función indica que la app requiere la entrada de un controlador de movimiento de alta precisión y 6 DoF (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 seguimiento 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 seguimiento de manos y no puede funcionar sin él, establece el valor en true
. Si tu app admite el seguimiento 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
Esta marca indica que la app requiere un seguimiento de ojos de alta fidelidad para que la entrada funcione correctamente. Si tu app admite el seguimiento ocular para la entrada y no puede funcionar sin él, establece el valor en true
. Si tu app admite el seguimiento ocular para la entrada, pero puede funcionar sin él, configúralo como 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" />
Consideraciones sobre la compatibilidad del manifiesto de la app para apps para dispositivos móviles y pantallas grandes
no se mostrará en Play Store en Android XR.Como se describe en la sección Funciones de PackageManager para apps de XR, las apps declaran que usan una función declarándola en un elemento <uses-feature>
en el manifiesto de la app. Es posible que algunas funciones, como la telefonía o el GPS, no sean compatibles con todos los dispositivos.
Características no admitidas
Google Play Store filtra las aplicaciones disponibles para instalar en un dispositivo con las siguientes declaraciones de funciones de Android.
Hardware de la cámara
android.hardware.camera.autofocus
android.hardware.camera.capability.manual_post_processing
android.hardware.camera.capability.manual_sensor
android.hardware.camera.capability.raw
android.hardware.camera.concurrent
android.hardware.camera.external
android.hardware.camera.level.full
Conectividad
android.hardware.ipsec_tunnel_migration
Configuración del dispositivo
Configuración del factor de forma
android.hardware.type.automotive
android.hardware.type.embedded
android.hardware.type.television
android.software.leanback_only
Entrada
android.software.input_methods
Ubicación
Comunicación de campo cercano
Configuración de seguridad y hardware
android.hardware.se.omapi.uicc
android.hardware.biometrics.face
android.hardware.identity_credential
android.hardware.identity_credential_direct_access
android.hardware.keystore.limited_use_key
android.hardware.keystore.single_use_key
android.hardware.strongbox_keystore
Sensores
android.hardware.sensor.accelerometer_limited_axes
android.hardware.sensor.accelerometer_limited_axes_uncalibrated
android.hardware.sensor.ambient_temperature
android.hardware.sensor.barometer
android.hardware.sensor.gyroscope_limited_axes
android.hardware.sensor.gyroscope_limited_axes_uncalibrated
android.hardware.sensor.heading
android.hardware.sensor.heartrate
android.hardware.sensor.heartrate.ecg
android.hardware.sensor.hinge_angle
android.hardware.sensor.relative_humidity
android.hardware.sensor.stepcounter
android.hardware.sensor.stepdetector
Configuración del software
android.software.connectionservice
android.software.expanded_picture_in_picture
android.software.live_wallpaper
android.software.picture_in_picture
android.software.wallet_location_based_suggestions
Telefonía
android.hardware.telephony.calling
android.hardware.telephony.cdma
android.hardware.telephony.data
android.hardware.telephony.euicc
android.hardware.telephony.euicc.mep
android.hardware.telephony.gsm
android.hardware.telephony.ims
android.hardware.telephony.mbms
android.hardware.telephony.messaging
android.hardware.telephony.radio.access
android.hardware.telephony.subscription
Realidad virtual (heredada)
android.hardware.vr.headtracking
android.hardware.vr.high_performance
Widgets
Información sobre los permisos de la XR
Al igual que las apps en dispositivos móviles y otros factores de forma, algunas capacidades que ofrecen las apps para XR pueden requerir que declares permisos en el archivo AndroidManifest de tu app. En el caso de los permisos riesgosos, es posible que tu app deba solicitar permisos de tiempo de ejecución. Para obtener información más detallada, consulta Permisos en Android y las prácticas recomendadas sobre permisos.
Las apps de XR pueden usar los siguientes permisos. Todos los permisos de esta sección se consideran permisos peligrosos, por lo que debes declararlos en el manifiesto de tu app y solicitarlos durante el tiempo de ejecución.
android.permission.EYE_TRACKING_COARSE
Representa la postura, el estado y la orientación de los ojos del usuario, por ejemplo, para usar con avatares. Usa este permiso cuando se necesiten datos de seguimiento de ojos de baja precisión.
SDK de Jetpack XR
N/A
Extensiones de OpenXR
Funciones de Unity
android.permission.EYE_TRACKING_FINE
Mirada para seleccionar, ingresar datos y realizar interacciones
SDK de Jetpack XR
N/A
Extensiones de OpenXR
Funciones de Unity
android.permission.FACE_TRACKING
Seguimiento y renderización de expresiones faciales
SDK de Jetpack XR
N/A
Extensiones de OpenXR
Funciones de Unity
android.permission.HAND_TRACKING
Seguimiento de las poses de las articulaciones de las manos y las velocidades angulares y lineales; uso de una representación de malla de las manos del usuario
SDK de Jetpack XR
Extensiones de OpenXR
Funciones de Unity
android.permission.SCENE_UNDERSTANDING_COARSE
Estimación de la luz, proyección de la visualización a través de superficies de malla, realización de raycasts en objetos rastreables del entorno, rastreo de planos, rastreo de objetos y anclajes persistentes.
SDK de Jetpack XR
Extensiones de OpenXR
Funciones de Unity
android.permission.SCENE_UNDERSTANDING_FINE
Es la textura de profundidad.
SDK de Jetpack XR
N/A
Extensiones de OpenXR
Funciones de Unity
Verifica la calidad de las apps para Android XR
Para verificar que tu app proporcione una excelente experiencia del usuario, revisa nuestros lineamientos de calidad de las apps para Android XR.
Cómo empaquetar y distribuir tu app para Android XR
Android XR ofrece una amplia variedad de apps y experiencias para visores de XR a través de Google Play. En la guía para empaquetar y distribuir apps para Android XR, encontrarás información para comenzar a usar Play Store y Play Console, publicar segmentos, preparar paquetes de Android App Bundle y conocer las restricciones de tamaño de las apps.
OpenXR™ y el logotipo de OpenXR son marcas comerciales propiedad de The Khronos Group Inc. y están registradas como marcas comerciales en China, la Unión Europea, Japón y el Reino Unido.