docs.unity3d.com
Search Results for

    Show / Hide Table of Contents

    Permissions

    Some XR features require system permissions on the Android XR runtime. Refer to the following table for a list of OpenXR features and the permissions they require. The documentation for each features provides a code example you can use to request the relevant permission.

    Note

    If a feature requires the coarse version of a permission, you can also use the fine version of that permission. For example, if the feature requires android.permission.SCENE_UNDERSTANDING_COARSE, you can use android.permission.SCENE_UNDERSTANDING_FINE.

    Feature Permission
    Plane detection android.permission.SCENE_UNDERSTANDING_COARSE
    Hand tracking android.permission.HAND_TRACKING
    Face tracking android.permission.EYE_TRACKING_COARSE
    Gaze interaction profile android.permission.EYE_TRACKING_FINE
    Light estimation android.permission.SCENE_UNDERSTANDING_COARSE

    Request multiple permissions simultaneously

    If your app needs to request multiple permissions at once, you should use Permission.RequestUserPermissions.

    Use the following example code to request multiple permissions at once:

            const string k_SceneUnderstandingFinePermission = "android.permission.SCENE_UNDERSTANDING_FINE";
            const string k_SceneUnderstandingCoarsePermission = "android.permission.SCENE_UNDERSTANDING_COARSE";
            const string k_HandTrackingPermission = "android.permission.HAND_TRACKING";
            const string k_EyeTrckingCoarsePermission = "android.permission.EYE_TRACKING_COARSE";
            const string k_EyeTrackingFinePermission = "android.permission.EYE_TRACKING_FINE";
    
            [SerializeField]
            ARPlaneManager m_ARPlaneManager;
    
            [SerializeField]
            ARFaceManager m_ARFaceManager;
    
            [SerializeField]
            AROcclusionManager m_AROcclusionManager;
    
    #if UNITY_ANDROID
            void Start()
            {
                var permissions = new List<string>();
    
                // add permissions that have not been granted by the user
                if (!Permission.HasUserAuthorizedPermission(k_SceneUnderstandingCoarsePermission))
                {
                    permissions.Add(k_SceneUnderstandingCoarsePermission);
                }
                else
                {
                    // enable the AR Plane Manager component if permission is already granted
                    m_ARPlaneManager.enabled = true;
                }
    
                if (!Permission.HasUserAuthorizedPermission(k_SceneUnderstandingFinePermission))
                {
                    permissions.Add(k_SceneUnderstandingFinePermission);
                }
                else
                {
                    // enable the AR Occlusion Manager component if permission is already granted
                    m_AROcclusionManager.enabled = true;
                    m_AROcclusionManager.subsystem.Stop();
                    m_AROcclusionManager.subsystem.Start();
                }
    
                if (!Permission.HasUserAuthorizedPermission(k_HandTrackingPermission))
                {
                    permissions.Add(k_HandTrackingPermission);
                }
    
                if (!Permission.HasUserAuthorizedPermission(k_EyeTrackingFinePermission))
                {
                    permissions.Add(k_EyeTrackingFinePermission);
                }
                else
                {
                    // enable the AR Face Manager component if permission is already granted
                    m_ARFaceManager.enabled = true;
                }
    
                if (!Permission.HasUserAuthorizedPermission(k_EyeTrckingCoarsePermission))
                {
                    permissions.Add(k_EyeTrckingCoarsePermission);
                }
    
                // setup callbacks to be called depending on whether permission is granted
                var callbacks = new PermissionCallbacks();
                callbacks.PermissionDenied += OnPermissionDenied;
                callbacks.PermissionGranted += OnPermissionGranted;
    
                Permission.RequestUserPermissions(permissions.ToArray(), callbacks);
            }
    
            void OnPermissionDenied(string permission)
            {
                // handle denied permission
            }
    
            void OnPermissionGranted(string permission)
            {
                // enable the corresponding AR Manager component after required permission is granted
                if (permission == k_SceneUnderstandingCoarsePermission)
                {
                    m_ARPlaneManager.enabled = true;
                }
                else if (permission == k_EyeTrckingCoarsePermission)
                {
                    m_ARFaceManager.enabled = true;
                }
            }
    #endif // UNITY_ANDROID
    

    Refer to Request runtime permissions for more information on Android permissions in Unity.

    Additional resources

    • Android permissions
    • Plane detection
    • Hand tracking
    • Face tracking
    • Gaze interaction profile
    In This Article
    Back to top
    Copyright © 2025 Unity Technologies — Trademarks and terms of use
    • Legal
    • Privacy Policy
    • Cookie Policy
    • Do Not Sell or Share My Personal Information
    • Your Privacy Choices (Cookie Settings)