Visão geral do desenvolvimento para o Android XR

O Android XR é uma extensão da plataforma e do ecossistema Android. O SDK do Android XR foi projetado para permitir que você crie apps de realidade estendida usando ferramentas e frameworks Android conhecidos ou padrões abertos, como OpenXR e WebXR. Todos os apps compatíveis para dispositivos móveis ou telas grandes estarão disponíveis para instalação em headsets XR na Play Store. Analise as considerações de compatibilidade para saber se o app é compatível.

Este guia explica as seguintes áreas:

  • Selecionar ferramentas e tecnologias de desenvolvimento
  • Como criar apps para Android XR
  • Como configurar o arquivo de manifesto do app
  • Considerações sobre a compatibilidade do manifesto do app
  • Noções básicas sobre as permissões do Android XR
  • Como verificar a qualidade do app Android XR
  • Empacotar e distribuir seu app para Android XR

Selecionar suas ferramentas e tecnologias de desenvolvimento

Ao criar um app para Android XR, você pode escolher entre as seguintes plataformas e tecnologias de desenvolvimento:

SDK XR do Jetpack

O SDK do Jetpack para XR contém bibliotecas Jetpack do Android XR criadas para aproveitar os recursos exclusivos dos dispositivos de XR. Comece com este SDK se você quiser fazer o seguinte:

  • Otimizar ou melhorar um app para dispositivos móveis ou tablets Android
  • Criar um novo app Android XR usando o Android Studio e o Jetpack

Se você já tem experiência com o desenvolvimento usando o Android Jetpack, o SDK do Jetpack XR é uma opção natural para você. Ele foi projetado para se integrar perfeitamente a esses frameworks e bibliotecas, permitindo que você use o conhecimento atual para criar experiências imersivas de XR.

Saiba mais sobre o desenvolvimento com o SDK do Jetpack para XR.

Unity

O Unity Engine é um mecanismo de desenvolvimento 3D em tempo real que permite que artistas, designers e desenvolvedores colaborem para criar experiências imersivas e interativas. O suporte do Android XR do Unity oferece um alto nível de controle sobre as experiências 3D que você desenvolve, além de aproveitar o suporte OpenXR estabelecido e o ecossistema de desenvolvedores do Unity.

Se você já tem uma experiência de RV criada com o Unity ou se conhece o desenvolvimento com essa plataforma, comece com essa opção.

Saiba mais sobre o desenvolvimento com Unity para Android XR.

OpenXR

O OpenXR é um padrão aberto e livre de royalties que pode ser usado para criar experiências de XR multiplataforma de alto desempenho. O Android XR é compatível com o OpenXR 1.0 e 1.1, e estamos expandindo a especificação com novas extensões para o Android XR. Como o Android XR é criado com base em padrões abertos, as ferramentas de desenvolvimento que oferecem suporte ao OpenXR e ao Android devem ser compatíveis com o Android XR.

Saiba mais sobre a compatibilidade com OpenXR para Android XR.

WebXR

Com o WebXR, é possível criar experiências imersivas para a Web. Ele oferece acesso a dispositivos de RV e RA em navegadores da Web compatíveis, como o Chrome no Android XR.

Comece com essa opção se quiser criar uma experiência de XR para a Web ou adicionar recursos de XR a um app da Web. As experiências atuais do WebXR também funcionam no Android XR.

Saiba mais sobre como criar apps da Web com o WebXR.

Design para XR

A XR expande a superfície de design além das telas planas tradicionais. É possível criar experiências imersivas que misturam realidade física e virtual. Se você estiver criando uma experiência totalmente nova ou adicionando elementos imersivos a um app existente, o guia de design para Android XR pode ajudar você a começar.

Configurar o arquivo de manifesto do app

Assim como outros projetos de apps Android, seu app Android XR precisa ter um arquivo AndroidManifest.xml com configurações de manifesto específicas. O arquivo de manifesto descreve informações essenciais sobre o app para as ferramentas de build do Android, o sistema operacional Android e o Google Play. Consulte o guia de visão geral do manifesto do app para mais informações.

Para apps diferenciados de XR, o arquivo de manifesto precisa conter os seguintes elementos e atributos:

Propriedade PROPERTY_XR_ACTIVITY_START_MODE

A propriedade android:name="android.window.PROPERTY_XR_ACTIVITY_START_MODE" informa ao sistema que uma atividade precisa ser iniciada em um modo específico quando ela é iniciada.

Há três valores possíveis para essa propriedade:

  • XR_ACTIVITY_START_MODE_HOME_SPACE (somente SDK do Jetpack XR)
  • XR_ACTIVITY_START_MODE_FULL_SPACE_MANAGED (somente SDK do Jetpack XR)
  • XR_ACTIVITY_START_MODE_FULL_SPACE_UNMANAGED (somente OpenXR)

XR_ACTIVITY_START_MODE_HOME_SPACE

(Somente apps criados com o SDK do Jetpack para XR)

Use esse modo de início para abrir o app no Espaço Compacto. No Espaço Compacto, vários apps podem ser executados lado a lado para que os usuários possam realizar várias tarefas. Qualquer app Android para dispositivos móveis ou telas grandes pode operar no Espaço Compacto, assim como apps XR criados usando o SDK 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

(Somente apps criados com o SDK do Jetpack para XR)

Use esse modo de início para abrir o app no Modo de Espaço Ampliado. No Modo de Espaço Ampliado, apenas um app é executado por vez, sem limites de espaço, e todos os outros apps ficam ocultos.


<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

(Somente apps criados com OpenXR)

Os apps criados com o OpenXR são iniciados no Modo de Espaço Ampliado e precisam usar o modo de início XR_ACTIVITY_START_MODE_FULL_SPACE_UNMANAGED. O espaço ampliado não gerenciado indica ao Android XR que o app usa o 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>

A propriedade android:name="android.window.PROPERTY_XR_BOUNDARY_TYPE_RECOMMENDED" indica que o aplicativo deve ser iniciado com um tipo específico de limite. Seu app precisa especificar XR_BOUNDARY_TYPE_LARGE se ele for projetado para permitir que os usuários se movam pelo espaço físico. Especificar XR_BOUNDARY_TYPE_NO_RECOMMENDATION não fornece recomendações para o tipo de limite de segurança. Portanto, o sistema usa o tipo que já está em 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

(Somente apps criados com OpenXR)

Os aplicativos OpenXR precisam declarar o uso da biblioteca nativa do OpenXR para carregar o tempo de execução com sucesso. Sem essa declaração, o ambiente de execução não vai carregar.

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

Recursos do PackageManager para apps de XR

Ao distribuir apps pela Google Play Store, você pode especificar os recursos de hardware ou software necessários no manifesto do app. O elemento uses-feature permite que a Play Store filtre adequadamente os apps mostrados aos usuários.

Os recursos a seguir são específicos de apps diferenciados por XR.

android.software.xr.api.spatial

Os apps criados com o SDK do Jetpack para XR precisam incluir esse recurso no manifesto do app. O valor definido para o atributo android:required depende da faixa de lançamento do app.

Se o app agrupar recursos ou conteúdo diferenciados de XR em um APK para dispositivos móveis e for publicado na faixa de lançamento para dispositivos móveis, defina o atributo android:required como 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" />

Se o app foi criado especificamente para dispositivos compatíveis com XR e publicado na faixa de lançamento dedicada do Android XR, defina o 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

Os apps destinados à plataforma Android XR e criados com OpenXR ou Unity precisam incluir esse recurso no manifesto do app com o atributo android:required definido como true.

Os apps que usam o Pacote de extensões do Android XR para Unity versão 1.0.0 ou mais recente ou o Pacote Android XR do Unity OpenXR versão 0.5.0-exp.1 ou mais recente não precisam adicionar esse elemento manualmente ao manifesto do app. Esses dois pacotes vão injetar esse elemento no manifesto do app para você.

Os dispositivos podem especificar uma versão para esse recurso, que indica a versão mais recente do OpenXR compatível com o dispositivo. Os 16 bits mais altos representam o número principal, e os 16 bits mais baixos representam o número secundário. Por exemplo, para especificar a versão 1.1 do OpenXR, o valor seria definido como "0x00010001".

Os apps podem usar a versão do recurso para indicar uma versão mínima do OpenXR exigida pelo app. Por exemplo, se o app exigir suporte para a versão 1.1 do OpenXR, declare o seguinte recurso:

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

android.hardware.xr.input.controller

Esse recurso indica que o app exige entrada de um controlador de movimento de alta precisão e 6DoF (graus de liberdade) para funcionar corretamente. Se o app for compatível com controles e não funcionar sem eles, defina o valor como true. Se o app for compatível com controles, mas puder funcionar sem eles, defina-o 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

Essa flag indica que o app exige rastreamento de mãos de alta fidelidade para funcionar corretamente, incluindo posição, orientação e velocidade das articulações na mão do usuário. Se o app for compatível com o rastreamento de mãos e não funcionar sem ele, defina o valor como true. Se o app oferecer suporte ao rastreamento de mãos, mas puder operar sem ele, defina 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

Essa flag indica que o app exige rastreamento ocular de alta fidelidade para que a entrada funcione corretamente. Se o app for compatível com rastreamento ocular para entrada e não puder funcionar sem ele, defina o valor como true. Se o app oferecer suporte ao rastreamento ocular para entrada, mas puder operar sem ele, defina 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" />

Considerações sobre a compatibilidade do manifesto do app para apps de dispositivos móveis e telas grandes

Conforme descrito na seção Recursos do PackageManager para apps de realidade estendida, os apps declaram que usam um recurso ao declará-lo em um elemento <uses-feature> no manifesto do app. Alguns recursos, como telefonia ou GPS, podem não ser compatíveis com todos os dispositivos.

Recursos não compatíveis

A Google Play Store filtra os aplicativos disponíveis para instalação em um dispositivo usando as seguintes declarações de recursos do Android.

Hardware da câmera

android.hardware.camera.ar

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

android.hardware.camera.level.full

Conectividade

android.hardware.ethernet

android.hardware.uwb

android.hardware.ipsec_tunnel_migration

Configuração do dispositivo

android.hardware.ram.low

Configuração de formato

android.hardware.type.automotive

android.hardware.type.embedded

android.hardware.type.pc

android.hardware.type.television

android.hardware.type.watch

android.software.leanback

android.software.leanback_only

android.software.live_tv

Entrada

android.hardware.consumerir

android.software.input_methods

Local

android.hardware.location.gps

Comunicação a curta distância

android.hardware.nfc

android.hardware.nfc.ese

android.hardware.nfc.hce

android.hardware.nfc.hcef

android.hardware.nfc.uicc

android.hardware.nfc.beam

Configuração de segurança e hardware

android.hardware.se.omapi.ese

android.hardware.se.omapi.sd

android.hardware.se.omapi.uicc

android.hardware.biometrics.face

android.hardware.fingerprint

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

android.hardware.sensor.relative_humidity

android.hardware.sensor.stepcounter

android.hardware.sensor.stepdetector

Configuração de software

android.software.backup

android.software.connectionservice

android.software.expanded_picture_in_picture

android.software.live_wallpaper

android.software.picture_in_picture

android.software.telecom

android.software.wallet_location_based_suggestions

Telefonia

android.hardware.telephony

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

android.software.sip

android.software.sip.voip

Realidade virtual (legada)

android.hardware.vr.headtracking

android.hardware.vr.high_performance

android.software.vr.mode

Widgets

android.software.app_widgets

Entender as permissões para XR

Assim como apps em dispositivos móveis e outros formatos, alguns recursos oferecidos por apps de RV exigem que seu app declare permissões no arquivo AndroidManifest do app. No caso de permissões perigosas, talvez o app precise solicitar permissões de execução. Leia Permissões no Android e práticas recomendadas de permissões para mais informações detalhadas.

Os apps de RV podem usar as seguintes permissões. Todas as permissões nesta seção são consideradas perigosas. Portanto, você precisa declará-las no manifesto do app e solicitá-las no tempo de execução.

android.permission.EYE_TRACKING_COARSE

Representa a postura, o status e a orientação dos olhos do usuário, como para uso com avatares. Use essa permissão quando forem necessários dados de rastreamento ocular de baixa precisão.

SDK XR do Jetpack

N/A

Extensões OpenXR

Recursos do Unity

android.permission.EYE_TRACKING_FINE

Rastreamento ocular para seleção, entrada e interações.

SDK XR do Jetpack

N/A

Extensões OpenXR

Recursos do Unity

android.permission.FACE_TRACKING

Rastreamento e renderização de expressões faciais.

SDK XR do Jetpack

N/A

Extensões OpenXR

Recursos do Unity

android.permission.HAND_TRACKING

Rastreamento de poses de articulações das mãos e velocidades angulares e lineares; uso de uma representação de malha das mãos do usuário.

android.permission.SCENE_UNDERSTANDING_COARSE

Estimativa de luz, projeção de transmissão em superfícies de malha, execução de raycasts em rastreáveis no ambiente, rastreamento de planos e objetos, âncoras persistentes.

android.permission.SCENE_UNDERSTANDING_FINE

Textura de profundidade.

SDK XR do Jetpack

N/A

Extensões OpenXR

Recursos do Unity

Verificar a qualidade do app Android XR

Para verificar se o app oferece uma ótima experiência do usuário, consulte as diretrizes de qualidade do app Android XR.

Empacotar e distribuir seu app para Android XR

O Android XR oferece uma grande variedade de apps e experiências para headsets de realidade virtual pelo Google Play. No guia para empacotar e distribuir apps para Android XR, você encontra informações sobre como começar a usar a Play Store e o Play Console, publicar faixas, preparar Android App Bundles e restrições de tamanho de apps.


OpenXR™ e o logotipo OpenXR são marcas registradas de propriedade da The Khronos Group Inc. e estão registradas como marcas comerciais na China, na União Europeia, no Japão e no Reino Unido.