Android XR is an extension of the Android platform and ecosystem. The Android XR
SDK is designed to let you build XR apps using familiar Android frameworks and
tools or using open standards such as OpenXR and WebXR. All compatible mobile or
large screen apps will be available to install on XR headsets from the Play
Store. Review the [compatibility considerations](https://developer.android.com/develop/xr/get-started#app-manifest) to see if your app is
compatible.

This guide explains the following areas:

- Selecting your development tools and technologies
- Designing apps for Android XR
- Configuring your app's manifest file
- App manifest compatibility considerations
- Understanding permissions for Android XR
- Verifying Android XR app quality
- Packaging and distributing your app for Android XR

## Select your development tools and technologies

When building an app for Android XR, you can choose from the following
development platforms and technologies:

### Jetpack XR SDK

The Jetpack XR SDK contains Android XR [Jetpack](https://developer.android.com/jetpack) libraries built
to take advantage of the unique capabilities of XR devices. Start with this SDK
if you want to do either of the following:

- Optimize or enhance an existing Android mobile or tablet app
- Build a new Android XR app using Android Studio and Jetpack

If you're already comfortable developing with Android Jetpack, the Jetpack XR
SDK is a natural fit for you. It's designed to seamlessly integrate with those
frameworks and libraries, and lets you use existing knowledge for building
immersive XR experiences.

[Learn more about developing with the Jetpack XR SDK](https://developer.android.com/develop/xr/jetpack-xr-sdk).

### Unity

[Unity Engine](https://unity.com/products/unity-engine) is a real-time 3D development engine that lets
artists, designers, and developers collaborate to create immersive and
interactive experiences. Unity's Android XR support gives you a high level of
control over the 3D experiences you develop, while benefitting from Unity's
established OpenXR support and developer ecosystem.

If you already have an XR experience built with Unity or if you are familiar
with Unity development, then start with this option.

[Learn more about developing with Unity for Android XR](https://developer.android.com/develop/xr/unity).

### OpenXR

[OpenXR](https://www.khronos.org/openxr/) is a royalty-free, open standard that can be used for
building high-performance, multi-platform XR experiences. Android XR supports
OpenXR 1.0 and 1.1, and we are expanding the specification with [new
extensions](https://developer.android.com/develop/xr/openxr/extensions) for Android XR. Because Android XR is built on open standards,
development tools that support OpenXR and Android should be compatible with
Android XR.

[Learn more about OpenXR support for Android XR](https://developer.android.com/develop/xr/openxr).

### WebXR

WebXR lets you build immersive experiences for the web. It provides access to VR
and AR devices in compatible web browsers such as Chrome on Android XR.

Start with this option if you want to build an XR experience for the web or if
you want to add XR capabilities to a web app. Existing WebXR experiences will
also work on Android XR.

[Learn more about building web apps with WebXR](https://developer.android.com/develop/xr/develop-with-webxr).

## Design for XR

XR expands the design surface beyond traditional flat screens; you can design
immersive experiences that blend physical and virtual reality. Whether you are
building a brand new experience or adding immersive elements to an existing app,
the [design for Android XR guide](https://developer.android.com/design/ui/xr/guides/get-started) can help you get started.

## Configure your app's manifest file

As with other Android app projects, your Android XR app must have an
AndroidManifest.xml file with specific manifest settings. The manifest file
describes essential information about your app to the Android build tools, the
Android operating system, and Google Play. See the [app manifest overview
guide](https://developer.android.com/guide/topics/manifest/manifest-intro) for more information.
| **Note:** If you use one of the [Android XR packages for Unity](https://developer.android.com/develop/xr/unity), you don't need to add these elements or attributes manually. The Unity packages create the manifest for your app based on your project and build settings.

For [XR differentiated apps](https://developer.android.com/docs/quality-guidelines/android-xr#android-xr-differentiated), your manifest file must contain the following
elements and attributes:

### PROPERTY_XR_ACTIVITY_START_MODE property

The `android:name="android.window.PROPERTY_XR_ACTIVITY_START_MODE"` property
lets the system know that an activity should be launched in a specific mode when
the activity is started.

There are three possible values for this property:

- `XR_ACTIVITY_START_MODE_HOME_SPACE` (Jetpack XR SDK only)
- `XR_ACTIVITY_START_MODE_FULL_SPACE_MANAGED` (Jetpack XR SDK only)
- `XR_ACTIVITY_START_MODE_FULL_SPACE_UNMANAGED` (OpenXR only)

#### XR_ACTIVITY_START_MODE_HOME_SPACE

(Apps built with the Jetpack XR SDK only)

Use this start mode to launch your app in Home Space. In Home Space, multiple
apps can run side-by-side, so users can multitask. Any mobile or large screen
Android app can operate in Home Space, as well as XR apps built using the
Jetpack XR SDK.  

    <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

(Apps built with the Jetpack XR SDK only)

Use this start mode to launch your app in Full Space. In Full Space, only one
app runs at a time, with no space boundaries, and all other apps are hidden.  


    <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

(Apps built with OpenXR only)

Apps built with OpenXR launch in Full Space and must use
`XR_ACTIVITY_START_MODE_FULL_SPACE_UNMANAGED` start mode. Unmanaged Full Space
signals to Android XR the app uses OpenXR.
**Note:** If you use one of the [Android XR packages for Unity](https://developer.android.com/develop/xr/unity), your app will also launch in Full Space. However, you don't need to add this to your manifest manually. The Unity packages create the manifest for your app based on your project and build settings.  


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

### PROPERTY_XR_BOUNDARY_TYPE_RECOMMENDED property

The `android:name="android.window.PROPERTY_XR_BOUNDARY_TYPE_RECOMMENDED"`
property indicates that the application should be launched with a specific type
of boundary. Your app needs to specify [`XR_BOUNDARY_TYPE_LARGE`](https://developer.android.com/reference/androidx/xr/runtime/ManifestProperty#XR_BOUNDARY_TYPE_LARGE()) if it's
designed to let users move around their physical space. Specifying
[`XR_BOUNDARY_TYPE_NO_RECOMMENDATION`](https://developer.android.com/reference/androidx/xr/runtime/ManifestProperty#XR_BOUNDARY_TYPE_NO_RECOMMENDATION()) provides no recommendations for the
type of safety boundary, so the system uses the type that is already in use.  

    <manifest ... >

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

### \<uses-native-library\> OpenXR

(Apps built with OpenXR only)

OpenXR applications must declare the use of the native OpenXR library to
successfully load its runtime. Without this [declaration](https://developer.android.com/guide/topics/manifest/uses-native-library-element), the runtime will
fail to load.
**Note:** For Unity apps built using the Unity OpenXR: Android XR package version 1.0.0-pre.2 or higher or the Android XR Extensions for Unity package version 0.9.0 or higher,you don't need to add this to your manifest manually.  

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

### PackageManager features for XR apps

When you [distribute apps through the Google Play Store](https://developer.android.com/develop/xr/package-and-distribute), you
can specify required hardware or software features in the app manifest. The
[`uses-feature`](https://developer.android.com/guide/topics/manifest/uses-feature-element) element allows the Play Store to appropriately filter apps
shown to users.

The following features are specific to XR-differentiated apps.

#### android.software.xr.api.spatial

Apps that are built using the [Jetpack XR SDK](https://developer.android.com/develop/xr/get-started#jetpack-xr) must include this
feature in the app manifest. The value you set for the `android:required`
attribute depends on your app's [release track](https://developer.android.com/develop/xr/package-and-distribute#choose-release).

If your app bundles XR-differentiated features or content into an existing
mobile APK and is published on the mobile release track, then set the
`android:required` attribute to `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" />

If your app is built specifically for XR-enabled devices and is published to the
Android XR dedicated release track, then set the `android:required` attribute to
`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

Apps that target the Android XR platform and are built with OpenXR or Unity must
include this feature in the app manifest with the `android:required` attribute
set to `true`.

Apps that use the [Android XR Extensions Package for Unity](https://developer.android.com/develop/xr/unity#android-xr-extensions-unity)
version 1.0.0 or higher or the [Unity OpenXR: Android XR Package](https://developer.android.com/develop/xr/unity#unity-openxr) version
0.5.0-exp.1 or higher don't have to add this element manually to the app
manifest. These two packages will inject this element into the app manifest for
you.

Devices may specify a version for this feature, which indicates the highest
version of OpenXR supported by the device. The higher 16 bits represent the
major number, and the lower 16 bits represent the minor number. For example,
to specify OpenXR version 1.1, the value would be set to `"0x00010001"`.

Apps can use the feature version to indicate a minimum version of OpenXR that
the app requires. For example, if your app requires OpenXR version 1.1 support,
declare the following feature:  

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

#### android.hardware.xr.input.controller

This feature indicates that the app requires input from a high precision, 6DoF
(degrees of freedom) motion controller to function correctly. If your app
supports controllers and can't function without them, set the value to `true`.
If your app supports controllers but can operate without them, set it to
`false`.
**Note:** 6DoF motion controllers are a pair of hardware controllers, one for each hand. Each controller is tracked independently in space through six degrees of freedom - both linear and rotational movements. These controllers typically have several hardware buttons, including a trigger as well as haptic feedback.  

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

This flag indicates that the app requires high fidelity hand tracking to
function correctly, including position, orientation, and velocity of joints in
the user's hand. If your app supports hand tracking and can't function without
it, set the value to `true`. If your app supports hand tracking, but can operate
without it, set it to `false`.
**Note:** This flag is not required for detecting basic gestures such as pinching, poking, aiming, and gripping.  

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

This flag indicates that the app requires high-fidelity eye tracking for input
to function correctly. If your app supports eye tracking for input and can't
function without it, set the value to `true`. If your app supports eye tracking
for input, but can operate without it, set it to `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" />

| **Note:** Hand tracking and eye tracking are privacy-sensitive input methods and require the apps to request special permissions. See [Understand permissions
| for XR](https://developer.android.com/develop/xr/get-started#understand-permissions) on this page for more information on declaring permissions.

## App manifest compatibility considerations for mobile and large screen apps

| **Note:** This section applies only to mobile or large screen apps that haven't been optimized for XR. By default, these kinds of Android apps will run on Android XR. However, if your app requires one or more of the features in this section, the app won't be shown in the Play Store on Android XR.

As described in the [PackageManager features for XR apps](https://developer.android.com/develop/xr/get-started#packagemanager-features) section, apps
declare that they use a feature by declaring it in a [`<uses-feature>`](https://developer.android.com/guide/topics/manifest/uses-feature-element)
element in the app manifest. Some features, such as telephony or GPS, might not
be compatible with all devices.
| **Note:** To get a listing of the features that are enabled for a device, run `adb
| shell pm list features`.

### Unsupported features

The [Google Play store filters applications](https://developer.android.com/guide/topics/manifest/uses-feature-element#market-feature-filtering) available
for installation on a device by using the following Android feature
declarations.
| **Caution:** If your app requires a feature that is not supported on the device, then that app won't be available for installation from the Play Store for XR devices. If your app uses the feature, but is designed to run without it, you should set `android:required="false`". For example, `<uses-feature android:name="android.hardware.location.gps"
| android:required="false" />`.

#### Camera Hardware

[`android.hardware.camera.ar`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_CAMERA_AR)

[`android.hardware.camera.autofocus`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_CAMERA_AUTOFOCUS)

[`android.hardware.camera.capability.manual_post_processing`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_CAMERA_CAPABILITY_MANUAL_POST_PROCESSING)

[`android.hardware.camera.capability.manual_sensor`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_CAMERA_CAPABILITY_MANUAL_SENSOR)

[`android.hardware.camera.capability.raw`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_CAMERA_CAPABILITY_RAW)

[`android.hardware.camera.concurrent`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_CAMERA_CONCURRENT)

[`android.hardware.camera.external`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_CAMERA_EXTERNAL)

[`android.hardware.camera.flash`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_CAMERA_FLASH)

[`android.hardware.camera.level.full`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_CAMERA_LEVEL_FULL)

#### Connectivity

[`android.hardware.ethernet`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_ETHERNET)

[`android.hardware.uwb`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_UWB)

[`android.hardware.ipsec_tunnel_migration`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_IPSEC_TUNNEL_MIGRATION)

#### Device Configuration

[`android.hardware.ram.low`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_RAM_LOW)

#### Form Factor Configuration

[`android.hardware.type.automotive`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_AUTOMOTIVE)

[`android.hardware.type.embedded`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_EMBEDDED)

[`android.hardware.type.pc`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_PC)

[`android.hardware.type.television`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_TELEVISION)

[`android.hardware.type.watch`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_WATCH)

[`android.software.leanback`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_LEANBACK)

[`android.software.leanback_only`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_LEANBACK_ONLY)

[`android.software.live_tv`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_LIVE_TV)

#### Input

[`android.hardware.consumerir`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_CONSUMER_IR)

[`android.software.input_methods`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_INPUT_METHODS)

#### Location

[`android.hardware.location.gps`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_LOCATION_GPS)

#### Near Field Communication

[`android.hardware.nfc`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_NFC)

[`android.hardware.nfc.ese`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_NFC_OFF_HOST_CARD_EMULATION_ESE)

[`android.hardware.nfc.hce`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_NFC_HOST_CARD_EMULATION)

[`android.hardware.nfc.hcef`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_NFC_HOST_CARD_EMULATION_NFCF)

[`android.hardware.nfc.uicc`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_NFC_OFF_HOST_CARD_EMULATION_UICC)

[`android.hardware.nfc.beam`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_NFC_BEAM)

#### Security Configuration and Hardware

[`android.hardware.se.omapi.ese`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_SE_OMAPI_ESE)

[`android.hardware.se.omapi.sd`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_SE_OMAPI_SD)

[`android.hardware.se.omapi.uicc`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_SE_OMAPI_UICC)

[`android.hardware.biometrics.face`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_FACE)

[`android.hardware.fingerprint`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_FINGERPRINT)

[`android.hardware.identity_credential`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_IDENTITY_CREDENTIAL_HARDWARE)

[`android.hardware.identity_credential_direct_access`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_IDENTITY_CREDENTIAL_HARDWARE_DIRECT_ACCESS)

[`android.hardware.keystore.limited_use_key`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_KEYSTORE_LIMITED_USE_KEY)

[`android.hardware.keystore.single_use_key`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_KEYSTORE_SINGLE_USE_KEY)

[`android.hardware.strongbox_keystore`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_STRONGBOX_KEYSTORE)

#### Sensors

[`android.hardware.sensor.accelerometer_limited_axes`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_SENSOR_ACCELEROMETER_LIMITED_AXES)

[`android.hardware.sensor.accelerometer_limited_axes_uncalibrated`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_SENSOR_ACCELEROMETER_LIMITED_AXES_UNCALIBRATED)

[`android.hardware.sensor.ambient_temperature`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_SENSOR_AMBIENT_TEMPERATURE)

[`android.hardware.sensor.barometer`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_SENSOR_BAROMETER)

[`android.hardware.sensor.gyroscope_limited_axes`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_SENSOR_GYROSCOPE_LIMITED_AXES)

[`android.hardware.sensor.gyroscope_limited_axes_uncalibrated`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_SENSOR_GYROSCOPE_LIMITED_AXES_UNCALIBRATED)

[`android.hardware.sensor.heading`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_SENSOR_HEADING)

[`android.hardware.sensor.heartrate`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_SENSOR_HEART_RATE)

[`android.hardware.sensor.heartrate.ecg`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_SENSOR_HEART_RATE_ECG)

[`android.hardware.sensor.hinge_angle`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_SENSOR_HINGE_ANGLE)

[`android.hardware.sensor.light`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_SENSOR_LIGHT)

[`android.hardware.sensor.relative_humidity`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_SENSOR_RELATIVE_HUMIDITY)

[`android.hardware.sensor.stepcounter`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_SENSOR_STEP_COUNTER)

[`android.hardware.sensor.stepdetector`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_SENSOR_STEP_DETECTOR)

#### Software Configuration

[`android.software.backup`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_BACKUP)

[`android.software.connectionservice`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_CONNECTION_SERVICE)

[`android.software.expanded_picture_in_picture`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_EXPANDED_PICTURE_IN_PICTURE)

[`android.software.live_wallpaper`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_LIVE_WALLPAPER)

[`android.software.picture_in_picture`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_PICTURE_IN_PICTURE)

[`android.software.telecom`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_TELECOM)

[`android.software.wallet_location_based_suggestions`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_WALLET_LOCATION_BASED_SUGGESTIONS)

#### Telephony

[`android.hardware.telephony`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_TELEPHONY)

[`android.hardware.telephony.calling`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_TELEPHONY_CALLING)

[`android.hardware.telephony.cdma`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_TELEPHONY_CDMA)

[`android.hardware.telephony.data`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_TELEPHONY_DATA)

[`android.hardware.telephony.euicc`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_TELEPHONY_EUICC)

[`android.hardware.telephony.euicc.mep`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_TELEPHONY_EUICC_MEP)

[`android.hardware.telephony.gsm`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_TELEPHONY_GSM)

[`android.hardware.telephony.ims`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_TELEPHONY_IMS)

[`android.hardware.telephony.mbms`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_TELEPHONY_MBMS)

[`android.hardware.telephony.messaging`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_TELEPHONY_MESSAGING)

[`android.hardware.telephony.radio.access`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_TELEPHONY_RADIO_ACCESS)

[`android.hardware.telephony.subscription`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_TELEPHONY_SUBSCRIPTION)

[`android.software.sip`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_SIP)

[`android.software.sip.voip`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_SIP_VOIP)

#### Virtual Reality (Legacy)

[`android.hardware.vr.headtracking`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_VR_HEADTRACKING)

[`android.hardware.vr.high_performance`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_VR_MODE_HIGH_PERFORMANCE)

[`android.software.vr.mode`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_VR_MODE)

#### Widgets

[`android.software.app_widgets`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_APP_WIDGETS)

## Understand permissions for XR

Just like apps on mobile devices and other form factors, some capabilities
offered by XR apps may require your app to [declare permissions](https://developer.android.com/training/permissions/declaring#add-to-manifest)
in your app's AndroidManifest file. In the case of dangerous permissions, your
app may need to [request runtime permissions](https://developer.android.com/training/permissions/requesting). Read [Permissions
on Android](https://developer.android.com/guide/topics/permissions/overview) and [permission best practices](https://developer.android.com/training/permissions/usage-notes) for more
in-depth information.

The following permissions may be used by XR apps. All of the permissions in this
section are considered dangerous permissions, so you must declare them in your
app manifest **and** request them at runtime.

### android.permission.EYE_TRACKING_COARSE

Representing the user's eye pose, status, and orientation, such as for use with
avatars. Use this permission when low-precision eye tracking data is needed.  

### Jetpack XR SDK

n/a

### OpenXR Extensions

- [`XR_ANDROID_eye_tracking`](https://developer.android.com/develop/xr/openxr/extensions/XR_ANDROID_eye_tracking)
- [`xrGetCoarseTrackingEyesInfoANDROID`](https://developer.android.com/develop/xr/openxr/extensions/XR_ANDROID_eye_tracking)

### Unity Features

- [Android XR: AR Face](https://docs.unity3d.com/Packages/com.unity.xr.androidxr-openxr@0.4/manual/features/faces.html)

### android.permission.EYE_TRACKING_FINE

Eye gaze for selection, input, and interactions.  

### Jetpack XR SDK

n/a

### OpenXR Extensions

- [`XR_EXT_eye_gaze_interaction`](https://registry.khronos.org/OpenXR/specs/1.0/html/xrspec.html#XR_EXT_eye_gaze_interaction)
- [`xrGetFineTrackingEyesInfoANDROID`](https://developer.android.com/develop/xr/openxr/extensions/XR_ANDROID_eye_tracking)

### Unity Features

- [Eye Gaze Interaction](https://docs.unity3d.com/Packages/com.unity.xr.openxr@1.13/manual/features/eyegazeinteraction.html)

### android.permission.FACE_TRACKING

Tracking and rendering facial expressions.  

### Jetpack XR SDK

n/a

### OpenXR Extensions

- [`XR_ANDROID_face_tracking`](https://developer.android.com/develop/xr/unity/reference/class/Google/XR/Extensions/XRFaceTrackingFeature)

### Unity Features

- [`XRFaceTrackingFeature`](https://developer.android.com/develop/xr/unity/reference/class/Google/XR/Extensions/XRFaceTrackingFeature)

### android.permission.HAND_TRACKING

Tracking hand joint poses and angular and linear velocities; Using a mesh
representation of the user's hands.
**Note:** This permission is not required for detecting basic gestures such as pinching, poking, aiming, and gripping.  

### Jetpack XR SDK

- [Hand state and joint poses](https://developer.android.com/develop/xr/jetpack-xr-sdk/work-with-hands)

### OpenXR Extensions

- [`XR_ANDROID_hand_mesh`](https://developer.android.com/develop/xr/openxr/extensions/XR_ANDROID_hand_mesh)

- [`XR_EXT_hand_tracking`](https://registry.khronos.org/OpenXR/specs/1.0/html/xrspec.html#XR_EXT_hand_tracking)

### Unity Features

- [`XR Hands`](https://docs.unity3d.com/Packages/com.unity.xr.hands@1.5/manual/index.html)

- [`XRHandMeshFeature`](https://developer.android.com/develop/xr/unity/reference/class/Google/XR/Extensions/XRHandMeshFeature)

### android.permission.SCENE_UNDERSTANDING_COARSE

Light estimation; projecting passthrough onto mesh surfaces; performing raycasts
against trackables in the environment; plane tracking; object tracking;
persistent anchors.  

### Jetpack XR SDK

- [`PanelEntity`](https://developer.android.com/develop/xr/jetpack-xr-sdk/develop-ui#create-spatial)
- [Plane tracking](https://developer.android.com/develop/xr/jetpack-xr-sdk/work-with-arcore#retrieve-state)
- [Hit testing](https://developer.android.com/develop/xr/jetpack-xr-sdk/work-with-arcore#perform-hit-test)
- [Anchor persistence](https://developer.android.com/develop/xr/jetpack-xr-sdk/work-with-arcore#persist-anchor)

### OpenXR Extensions

- [`XR_ANDROID_anchor_persistence`](https://developer.android.com/develop/xr/openxr/extensions/XR_ANDROID_device_anchor_persistence)
- [`XR_ANDROID_light_estimation`](https://developer.android.com/develop/xr/openxr/extensions/XR_ANDROID_light_estimation)
- [`XR_ANDROID_composition_layer_passthrough_mesh`](https://developer.android.com/develop/xr/openxr/extensions/XR_ANDROID_composition_layer_passthrough_mesh)
- [`XR_ANDROID_raycast`](https://developer.android.com/develop/xr/openxr/extensions/XR_ANDROID_raycast)
- [`XR_ANDROID_trackables`](https://developer.android.com/develop/xr/openxr/extensions/XR_ANDROID_trackables)
- [`XR_ANDROID_trackables_object`](https://developer.android.com/develop/xr/openxr/extensions/XR_ANDROID_trackables_object)

### Unity Features

- [`XRAnchorFeature`](https://developer.android.com/develop/xr/unity/reference/class/Google/XR/Extensions/XRAnchorFeature)
- [`XRLightEstimationFeature`](https://developer.android.com/develop/xr/unity/reference/class/Google/XR/Extensions/XRLightEstimationFeature)
- [`XRPassthroughFeature`](https://developer.android.com/develop/xr/unity/reference/class/Google/XR/Extensions/XRPassthroughFeature)
- [`XRTrackableFeature`](https://developer.android.com/develop/xr/unity/reference/class/Google/XR/Extensions/XRTrackableFeature)
- [`XRObjectTrackingFeature`](https://developer.android.com/develop/xr/unity/reference/class/Google/XR/Extensions/XRObjectTrackingFeature)

### android.permission.SCENE_UNDERSTANDING_FINE

Depth texture.  

### Jetpack XR SDK

n/a

### OpenXR Extensions

- [`XR_ANDROID_depth_texture`](https://developer.android.com/develop/xr/openxr/extensions/XR_ANDROID_depth_texture)

### Unity Features

- [`XRDepthTextureFeature`](https://developer.android.com/develop/xr/unity/reference/class/Google/XR/Extensions/XRDepthTextureFeature)

## Verify Android XR app quality

To verify that your app provides a great user experience, review our [Android XR
app quality guidelines](https://developer.android.com/docs/quality-guidelines/android-xr).

## Package and distribute your app for Android XR

Android XR brings a wide variety of apps and experiences to XR headsets through
Google Play. In the
[guide for packaging and distributing apps for Android XR](https://developer.android.com/develop/xr/package-and-distribute), you'll find
information on getting started with the Play Store and Play Console, publishing
tracks, preparing Android app bundles, and app size restrictions.

*** ** * ** ***

OpenXR™ and the OpenXR logo are trademarks owned
by The Khronos Group Inc. and are registered as a trademark in China,
the European Union, Japan and the United Kingdom.