Depois de instalar e configurar o Android Studio, criar um projeto e configurar o SDK do Jetpack para XR, você estará pronto para começar a criar experiências imersivas.
Antes de começar a explorar todas as maneiras de criar, revise as informações e conclua as tarefas nas seções a seguir para garantir que seu app esteja configurado para o desenvolvimento de XR imersivo.
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.
Essa propriedade tem os seguintes valores:
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_HOME_SPACE
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
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>
Propriedade PROPERTY_XR_BOUNDARY_TYPE_RECOMMENDED
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 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>
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 para apps diferenciados de 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.hardware.xr.input.controller
Esse recurso indica que o app precisa de 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 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 puder 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.
Para conferir uma lista dos recursos ativados em um dispositivo, execute adb
shell pm list features.
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.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
Conectividade
android.hardware.ipsec_tunnel_migration
Configuração do dispositivo
Configuração de formato
android.hardware.type.automotive
android.hardware.type.embedded
android.hardware.type.television
android.software.leanback_only
Entrada
android.software.input_methods
Local
Comunicação a curta distância
Configuração de segurança e 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
Configuração de 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
Telefonia
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
Realidade virtual (legada)
android.hardware.vr.headtracking
android.hardware.vr.high_performance
Widgets
Próximas etapas
Agora que você terminou de configurar o manifesto do app e revisar informações importantes, conheça maneiras de criar experiências imersivas:
- Leve seu app Android para o 3D com XR
- Desenvolver interfaces espaciais com o Jetpack Compose para XR
- Implementar o Material Design na sua UI espacial
- Adicionar ambientes espaciais ao app
- Criar, controlar e gerenciar entidades