Jetpack SceneCore

Compila y manipula el grafo de escena de Android XR con contenido 3D.
Actualización más reciente Versión estable Versión potencial Versión beta Versión alfa
7 de mayo de 2025 - - - 1.0.0-alpha04

Cómo declarar dependencias

Para agregar una dependencia en XR SceneCore, debes agregar el repositorio de Maven de Google a tu proyecto. Consulta el repositorio de Maven de Google para obtener más información.

Agrega las dependencias de los artefactos que necesites en el archivo build.gradle de tu app o módulo:

Groovy

dependencies {
    implementation "androidx.xr.scenecore:scenecore:1.0.0-alpha04"
    // Required for Java
    implementation "com.google.guava:listenablefuture:1.0"
    // Required for Kotlin
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-guava:1.9.0"

    // Use to write unit tests
    testImplementation "androidx.xr.scenecore:scenecore-testing:1.0.0-alpha04"
}

Kotlin

dependencies {
    implementation("androidx.xr.scenecore:scenecore:1.0.0-alpha04")
    // Required for Java
    implementation("com.google.guava:listenablefuture:1.0")
    // Required for Kotlin
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-guava:1.9.0")

    // Use to write unit tests
    testImplementation("androidx.xr.scenecore:scenecore-testing:1.0.0-alpha04")
}

Para obtener más información sobre las dependencias, consulta Cómo agregar dependencias de compilación.

Comentarios

Tus comentarios ayudan a mejorar Jetpack. Avísanos si descubres nuevos errores o tienes ideas para mejorar esta biblioteca. Consulta los errores existentes de esta biblioteca antes de crear uno nuevo. Puedes agregar tu voto a un error existente haciendo clic en el botón de la estrella.

Crear un error nuevo

Consulta la documentación sobre la Herramienta de seguimiento de errores para obtener más información.

Versión 1.0

Versión 1.0.0-alpha04

7 de mayo de 2025

Lanzamiento de androidx.xr.scenecore:scenecore:1.0.0-alpha04 y androidx.xr.scenecore:scenecore-testing:1.0.0-alpha04. La versión 1.0.0-alpha04 contiene estas confirmaciones.

Nuevas funciones

  • El control de la acción de volver ahora funcionará en las entidades de panel sin actividades incorporadas. Para que el control de atrás funcione, debes especificar android:enableOnBackInvokedCallback= "true" en el manifiesto de Android.
  • StereoSurfaceEntity ahora admite la reproducción de MV-HEVC a través de dos valores nuevos de StereoMode: MULTIVIEW_LEFT_PRIMARY y MULTIVIEW_RIGHT_PRIMARY.
  • PanelEntity.setSize y PanelEntity.getSize ahora devuelven tamaños en el espacio principal.
  • Entity.setPose, Entity.getPose, Entity.setScale, Entity.getScale, Entity.setAlpha y Entity.getAlpha ahora toman un nuevo parámetro relativeTo, que permite obtener o establecer valores relativos a diferentes espacios. Los valores admitidos son los espacios de Parent, Activity y Real World, y el valor predeterminado para este parámetro es Parent.
  • Se agregaron métodos de extensión de devolución de llamada de visibilidad espacial a SessionExt.kt para supervisar cuándo el contenido de la escena se mueve dentro o fuera del campo de visión del usuario.
  • Se agregó setPointSourceParams a SpatialAudioTrack, lo que permite actualizar los parámetros después de que se haya creado el segmento.
  • Se agregó una nueva clase, Scene, con referencias a las APIs de Scenecore. Se podrá acceder a la escena como una propiedad de extensión de Session. Las funciones dentro de SessionExt se movieron a Scene, por lo que se deberán ajustar las importaciones; por ejemplo, SessionExt.getScene(session).addSpatialCapababilitiesChangedListener en comparación con SessionExt.addSpatialCapabilitiesChangedListener
  • Se agregó ActivityPose.hitTestAsync, lo que permite un hitTest contra el contenido virtual.
  • Se agregó un nuevo tipo de componente SpatialPointerComponent, que permite a los clientes especificar el ícono renderizado para el puntero o inhabilitar el ícono. Actualmente, este componente solo se puede adjuntar a instancias de PanelEntity.
  • Se presentó una nueva fábrica de PanelEntity, que toma las dimensiones del panel en metros o píxeles. Se quitó la fábrica PanelEntity anterior que tomaba dos parámetros de tipo Dimension para el panel.

Cambios en la API

  • Se quitó la restricción de RequiresApi(34) en todos los paquetes de Jetpack XR. Esta restricción era redundante, ya que Jetpack XR actualmente solo está disponible en dispositivos con el nivel de API 34 y versiones posteriores. (Iae0f8)
  • Los proyectos lanzados con Kotlin 2.0 requieren que se consuma KGP 2.0.0 o una versión posterior (Idb6b5).
  • Se quitó la clase PermissionHelper.
  • PanelEntity.getPixelDensity ya no está disponible.
  • Se quitaron PanelEntity.setPixelDimensions y PanelEntity.getPixelDimension, y se reemplazaron por setSizeInPixels y getSizeInPixels.
  • Se quitó Entity.getActivitySpaceAlpha. Se puede reemplazar por Entity.getAlpha(Space.Activity).
  • Se quitó Entity.getWorldSpaceScale. Se puede reemplazar por Entity.getScale(Space.REAL\_WORLD).
  • Se borró la clase Session en SceneCore y se reemplazó por la clase Session en el tiempo de ejecución de XR.
  • El nombre de StereoSurfaceEntity cambió por SurfaceEntity.
  • Se quitaron Entity.setSize y Entity.getSize, y se agregaron los mismos métodos a PanelEntity.
  • El nombre de PointSourceAttributes cambió por PointSourceParams.
  • El nombre de SpatializerConstants.SOURCE\_TYPE\_BYPASS cambió por SpatializerConstants.SOURCE\_TYPE\_DEFAULT.
  • Se modificó la entidad PointSourceParams para que el acceso sea interno en lugar de público.
  • Ahora, AnchorEntity.create requiere que se configure PlaneTrackingMode en Session.configure().
  • Las APIs de SpatialUser ahora requieren que se configure HeadTrackingMode en Session.configure().
  • Cuando ResizableComponent no está adjunto, se proporcionará un registro de nivel INFO en lugar de un registro de nivel ERROR.
  • La clase Fov ahora es una clase normal de Kotlin.
  • Divide Entity.kt para colocar cada tipo de entidad concreta en su propio archivo.
  • Cuando se crea un PanelEntity nuevo, la mayoría de los objetos View se reasignan como hijos de un FrameLayout. Esto facilita el uso de LayoutInspector con los paneles espaciales.
  • La instancia de XrExtensions que se usa actualmente ahora está registrada en la plataforma, de la mejor manera posible, para ayudar con la depuración de la app.

Correcciones de errores

  • Se agregó una corrección para evitar una falla que podía ocurrir cuando se movía un PanelEntity con MovableComponent y AnchorPlacement.
  • Se solucionó un problema por el que ResizableComponent proporcionaba tamaños obsoletos en la devolución de llamada onResizeStart.
  • Se corrigió la falla que se producía cuando se llamaba varias veces al dispose() de JxrPlatformAdapterAxr.

Versión 1.0.0-alpha03

26 de febrero de 2025

Lanzamiento de androidx.xr.scenecore:scenecore:1.0.0-alpha03 y androidx.xr.scenecore:scenecore-testing:1.0.0-alpha03. La versión 1.0.0-alpha03 contiene estas confirmaciones.

Nuevas funciones

  • Ahora se admite la minimización de Proguard para el código de Jetpack XR

Correcciones de errores

  • Se agregaron correcciones adicionales para admitir la minimización de Proguard para Jetpack XR SceneCore (I4f47e).
  • Se actualizó la regla ProGuard de Jetpack XR Scenecore para evitar AbstractMethodError en clientes minimizados. (I91a01)

Versión 1.0.0-alpha02

12 de febrero de 2025

Lanzamiento de androidx.xr.scenecore:scenecore:1.0.0-alpha02 y androidx.xr.scenecore:scenecore-testing:1.0.0-alpha02. La versión 1.0.0-alpha02 contiene estas confirmaciones.

Próximo cambio rotundo que afectará a las apps compiladas antes de la versión 1.0.0-alpha02

  • Los métodos de fábrica se movieron de la clase Session a un método complementario en cada tipo respectivo:
    • Se borró Session.createActivityPanelEntity(Dimensions, String, Activity, Pose) y se reemplazó por ActivityPanelEntity.create(Session, Dimensions, String, Pose)
    • Se borró Session.createAnchorEntity(Anchor) y se reemplazó por AnchorEntity.create(Session, Anchor)
    • Se borró Session.createAnchorEntity(Dimensions, Int, Int, Duration) y se reemplazó por AnchorEntity.create(Session, Dimensions, Int, Int, Duration)
    • Se borró Session.createEntity(String, Pose) y se reemplazó por ContentlessEntity.create(Session, String, Pose)
    • Se borró Session.createExrImageResource(String) y se reemplazó por ExrImage.create(Session, String)
    • Se borró Session.createGltfEntity(GltfModel, Pose) y se reemplazó por GltfModelEntity.create(Session, GltfModel, Pose)
    • Se borró Session.createGltfModelResource(String) y se reemplazó por GltfModel.create(Session, String)
    • Se borró Session.createInteractableComponent(Executor, InputEventListener) y se reemplazó por InteractableComponent.create(Session, Executor, InputEventListener)
    • Se borró Session.createMovableComponent(Boolean, Boolean, Set<AnchorPlacement>, Boolean) y se reemplazó por MovableComponent.create(Session, Boolean, Boolean, Set<AnchorPlacement>, Boolean)
    • Se borró Session.createPanelEntity(View, Dimensions, Dimensions, String, Pose) y se reemplazó por PanelEntity.create(Session, View, Dimensions, Dimensions, String, Pose)
    • Se borró Session.createResizableComponent(Dimensions, Dimensions) y se reemplazó por ResizableComponent.create(Session, Dimensions, Dimensions)
    • Se borró Session.createStereoSurfaceEntity(Int, Dimensions, Pose) y se reemplazó por StereoSurface.create(Session, Int, Dimensions, Pose)
  • Se quitaron los siguientes métodos obsoletos:
    • Se borró Session.canEmbedActivityPanel(Activity). Usa getSpatialCapabilities.hasCapabilility(SPATIAL_CAPABILITY_EMBED_ACTIVITY) en su lugar.
    • Se borró Session.hasSpatialCapability(Int). Se reemplazó por el uso de getSpatialCapabilities().hasCapability() como una forma más compartimentada de verificar la presencia de capacidades espaciales, ya que getSpatialCapabilities() devuelve un objeto SpatialCapabilities.
    • Se borró Session.requestFullSpaceMode() y se reemplazó por SpatialEnvironment.requestFullSpaceMode()
    • Se borró Session.requestHomeSpaceMode() y se reemplazó por SpatialEnvironment.requestHomeSpaceMode()
  • Session.setFullSpaceMode(Bundle) y Session.setFullSpaceModeWithEnvironmentInherited(Bundle) se trasladaron a funciones de extensión. Los archivos del desarrollador deberán agregar las nuevas importaciones para el acceso:
    • import androidx.xr.scenecore.setFullSpaceMode
    • import androidx.xr.scenecore.setFullSpaceModeWithEnvironmentInherited
  • Session.setPreferredAspectRatio(Activity, Float) se trasladó a una función de extensión. Los archivos del desarrollador deberán agregar la nueva importación para acceder:
    • import androidx.xr.scenecore.setPreferredAspectRatio
  • Session.getEntitiesOfType(Class<out T>) y Session.getEntityForRtEntity(RtEntity) se trasladaron a funciones de extensión. Los archivos del desarrollador deberán agregar las nuevas importaciones para el acceso:
    • import androidx.xr.scenecore.getEntitiesOfType
    • import androidx.xr.scenecore.getEntityForRtEntity
  • Se borró Session.unpersistAnchor(Anchor)
  • Se borró Session.createPersistedAnchorEntity(UUID)

Errores conocidos

  • Es posible que PanelEntity.setCornerRadius() y ActivityPanelEntity.setCornerRadius() no surtan efecto hasta que se vuelva a mover el panel. Para evitar esto, mueve el panel a su posición actual.
  • Cuando se llama a BoundsChanged en ActivitySpace, es posible que algunos ActivityPose no se hayan actualizado correctamente. Se actualizará en la siguiente llamada de OnSpaceUpdated el ActivitySpace

Cambios rotundos y de comportamiento

  • PanelEntity y ActivityPanelEntity tendrán un radio de esquina predeterminado de 32 dp o menos si el panel tiene un ancho o una altura inferior a 32 dp.

Nuevas APIs y capacidades

  • Se presenta StereoSurface.CanvasShape, que permite crear lienzos Spherical y Hemispherical para renderizar contenido multimedia envolvente.
  • StereoSurfaceEntity.create() ahora acepta un parámetro CanvasShape. (Actualmente, este parámetro se ignora, pero se usará en una versión futura).
  • StereoSurfaceEntity.create() ya no toma un parámetro Dimensions. Las aplicaciones deben controlar el tamaño del lienzo configurando el CanvasShape.
  • StereoSurfaceEntity tiene un miembro CanvasShape que se puede establecer de forma dinámica.
  • StereoSurfaceEntity.dimensions ahora es una propiedad de solo lectura. Las aplicaciones deben establecer CanvasShape para cambiar las dimensiones.
  • StereoSurfaceEntity ahora permite que se vuelva a configurar StereoMode después de la construcción.

Otros cambios

  • Se redujo el valor de minSDK en tiempo de compilación a 24. Todas las APIs de Jetpack XR siguen requiriendo la API 34 en el tiempo de ejecución.
  • La fábrica de sesiones de SceneCore (Session.create) ya no inicia un intent para adquirir el permiso de SCENE_UNDERSTANDING. En su lugar, la aplicación cliente debe solicitar explícitamente los permisos al usuario antes de intentar crear los anclajes. La creación de anclajes fallará si el usuario no otorga el permiso.

Correcciones de errores

  • Se corrigió getActivitySpacePose() para tener en cuenta la escala de ActivitySpace, ya que ahora devuelve valores de traducción en metros escalados en lugar de devolver siempre metros sin escalar. Ahora, transformPoseTo también usa las unidades correctas para calcular los cambios de coordenadas cuando ActivitySpace está involucrado en la fuente o el destino.
  • Ahora, el skybox se establecerá en un skybox completamente negro cada vez que se pase una preferencia de skybox nula con setSpatialEnvironmentPreference(new SpatialEnvironmentPreference(null, geom)). Para volver al skybox y la geometría predeterminados del sistema, usa setSpatialEnvironmentPreference(null)..

Versión 1.0.0-alpha01

12 de diciembre de 2024

Lanzamiento de androidx.xr.scenecore:scenecore-* 1.0.0-alpha01.

Funciones de la versión inicial Versión inicial para desarrolladores de Jetpack SceneCore, una biblioteca de gráficos de escena en 3D para crear y manipular escenas y entornos inmersivos. Esta biblioteca te permite colocar y organizar modelos 3D y paneles de contenido en relación con otros elementos y tus entornos virtuales o del mundo real.

  • SpatialEnvironment: Crea experiencias completamente envolventes con una imagen de skybox o una geometría de modelo 3D como telón de fondo para la escena de XR de tu entorno. También puedes habilitar el modo de transferencia para que la escena virtual se integre con el entorno del mundo real del usuario.
  • PanelEntity: Agrega contenido 2D a tus escenas 3D incorporando diseños y actividades estándar de Android en paneles espacializados que pueden flotar o anclarse a superficies del mundo real.
  • GltfModelEntity: Coloca, anima e interactúa con modelos 3D en tu escena. SceneCore admite el formato de archivo glTF para facilitar la integración con modelos existentes.
  • SpatialAudio: Agrega fuentes de audio puntuales y ambientales a tu escena en 3D para obtener un sonido espacializado y completamente envolvente.
  • StereoSurfaceEntity: SceneCore admite el enrutamiento del contenido renderizado en una Surface de Android para el ojo izquierdo y el derecho. Se puede usar para renderizar contenido estereoscópico en formato lado a lado o de arriba a abajo, como fotos estéreo, videos en 3D o otras IU renderizadas de forma dinámica. Las aplicaciones deben usar MediaPlayer o ExoPlayer para la decodificación de video.
  • Sistema de componentes: SceneCore ofrece un sistema de componentes sólido y flexible para agregar capacidades a tu contenido de XR, incluidas las posibilidades para que los usuarios muevan, cambien de tamaño y manipulen modelos y paneles.
  • Anclaje: Con el modo de transferencia habilitado, puedes unir paneles y modelos a superficies reales, lo que les brinda a los usuarios una integración fluida del contenido virtual en su entorno del mundo real.
  • Pose del usuario: Accede a la ubicación del usuario en la escena virtual para orientar el contenido según su posición.
  • SpatialCapabilities: Compila apps completamente adaptables que aprovechen las capacidades espacializadas cuando estén disponibles, como el posicionamiento en 3D del contenido de la IU. No solo eso, sino que tu app puede supervisar los cambios en las capacidades mientras se ejecuta, para modificar la experiencia según cómo el usuario usa su dispositivo Android XR.

Errores conocidos

  • Actualmente, se requiere un minSDK de 30 para usar Jetpack SceneCore. Como solución alternativa, agrega la siguiente entrada de manifiesto <uses-sdk tools:overrideLibrary="androidx.xr.scenecore, androidx.xr.compose"/> para poder compilar y ejecutar con un minSDK de 23.
  • La sesión puede dejar de ser válida en varias situaciones que recrean automáticamente la actividad, como cambiar el tamaño de un panel principal, conectar periféricos y cambiar entre el modo claro y el modo oscuro. Si tienes problemas de invalidación de sesión, las soluciones alternativas incluyen hacer que tu panel principal no se pueda cambiar de tamaño, usar una entidad de panel dinámico, inhabilitar la recreación de actividades para cambios de configuración específicos o inhabilitar los cambios de tema del modo claro o modo oscuro.
  • Los componentes Movable y Resizable no son compatibles con GltfEntity.
  • Entity.getSize() no es compatible con GltfEntity.
  • Las apps de Jetpack XR deben solicitar el permiso android.permission.SCENE_UNDERSTANDING en AndroidManifest.
  • La creación de una sesión solo se admite en dispositivos Android XR. En este momento, si creas una sesión y tratas de usarla en un dispositivo XR que no sea Android, recibirás una RuntimeException.
  • Establecer la skybox como nula a través de `SpatialEnvironment.setSpatialEnvironmentPreference()` no genera una skybox negra sólida como se documentó. Puede generar la skybox predeterminada del sistema o no cambiar la skybox actual.
  • Los clientes de SceneCore deben agregar implementation(“com.google.guava:listenablefuture-1.0”) a la configuración de Gradle para las dependencias de su app. En una versión futura, scenecore incluirá esta biblioteca como una dependencia de api, por lo que los clientes no deberán declararla de forma explícita.
  • SceneCore incluye erróneamente com.google.guava:guava-31.1-android y com.google.protobuf:protobuf-javalite como dependencias transitivas. Si esto genera errores de clase duplicada en tu compilación, estas dos dependencias se pueden excluir de forma segura.
  • Si tu app usa SceneCore y habilita ProGuard, fallará cuando crees una sesión. Como solución alternativa, inhabilita ProGuard. Consulta esta guía para obtener más información sobre cómo habilitar ProGuard.