Unity Solicitar permisos de Android en el lado de Unity

I. Introducción

Cuando todavía estaba trabajando hace algún tiempo, me encontré con un problema de este tipo: cuando el SDK activaba la interfaz de la cámara por primera vez para tomar fotografías, activaba la cámara dos veces. Y volvió a aparecer después de que se tomó la segunda foto.
Después de analizarlo, solo sucederá cuando se obtenga el permiso por primera vez, y no sucederá cuando se obtenga el permiso. Y las 2 versiones de Android donde esto sucede son las 13. La suposición es que la interfaz de permisos del SDK no está bien adaptada a Android 13, por lo que primero trato de bajar TargetAPI a Android 10. Como se muestra en la figura a continuación, pero aún falla.
inserte la descripción de la imagen aquí
Luego pensé en otra forma. Dado que el SDK falla al solicitar permisos, primero solicito los permisos yo mismo y luego ajusto la interfaz del SDK. El SDK no necesita aplicarse porque ya tiene permisos. Después de probarlo, realmente funciona y el problema de flashback está resuelto. A continuación, hablemos sobre cómo solicitar permisos de Android en el lado de Unity

2. Pasos de operación

En general, hay dos formas de solicitar permisos de Android:
Método 1: Aplicar a través del código Java/Kotlin nativo de Android;
Método 2: Aplicar a través de UnityAPI, que será más conveniente;
Hablemos del Método 2

2.1 Permiso.Solicitud de permisos de usuario

  • Unity proporciona Permission.RequestUserPermission (solicitar un solo permiso) y Permission.RequestUserPermissions (solicitar varios permisos) para solicitar permisos.
  • El código de ejemplo es el siguiente
/*********************************************
   文件:Leran.cs
   作者:super41
   日期: 2023年7月05日14:05:49
   功能: 
**********************************************/



using System.Text;
using UnityEngine;
using UnityEngine.Android;
using UnityEngine.UI;




public class Learn : MonoBehaviour
{

    //UI相关
    public Button btn;
    public Text txt;
    
    //申请相关
    private PermissionCallbacks m_PermissionCallbacks;
    private StringBuilder m_StringBuilder;
    private bool m_IsGetAllPermission;
   
    void Awake()
    {
        btn.onClick.AddListener(()=>{RequestPermissions();});
    }



    /// <summary>
    /// 申请单一权限
    /// </summary>
    private void RequestCameraPermission()
    {
        if (!Permission.HasUserAuthorizedPermission(Permission.Camera))
        {
            Permission.RequestUserPermission(Permission.Camera);
        }
    }
        
    /// <summary>
    /// 申请多个权限
    /// </summary>
    private void RequestPermissions()
    {
        if (m_StringBuilder == null)
        {
            m_StringBuilder = new StringBuilder();
        }
        else
        {
            m_StringBuilder.Clear();
        }
        m_IsGetAllPermission = false;
        
        //申请回调
        m_PermissionCallbacks = new PermissionCallbacks();
        m_PermissionCallbacks.PermissionDenied += OnPermissionDenied;
        m_PermissionCallbacks.PermissionGranted += OnPermissionGranted;
        m_PermissionCallbacks.PermissionDeniedAndDontAskAgain += OnPermissionDeniedAndDontAskAgain;
        
        //申请权限组
        string[] permissions =
        {
            Permission.Camera,
            Permission.ExternalStorageRead,
            Permission.ExternalStorageWrite,
            // 添加其他权限
        };

        //执行申请多个权限
        Permission.RequestUserPermissions(permissions,m_PermissionCallbacks);

    }
    
    /// <summary>
    /// 申请权限被拒绝
    /// </summary>
    /// <param name="permission"></param>
    private void OnPermissionDenied(string permission)
    {
        Write($"OnPermissionDenied:{permission}");
    }
    
    
    /// <summary>
    /// 申请权限成功
    /// </summary>
    /// <param name="permission"></param>
    private void OnPermissionGranted(string permission)
    {
        Write($"OnPermissionGranted:{permission}");
        //检查权限是否全部通过
        if (Permission.HasUserAuthorizedPermission(Permission.Camera) &&
            Permission.HasUserAuthorizedPermission(Permission.ExternalStorageRead) &&
            Permission.HasUserAuthorizedPermission(Permission.ExternalStorageWrite))
        {
            
            //一次申请多个权限,比如申请2个。会依次弹窗进行申请,在全部交互完成后才开始回调接口。如若玩家全部同意。这里会回调2次
            //所以这里需要加个变量防止重复回调
            if (!m_IsGetAllPermission)
            {
                m_IsGetAllPermission = true;
                //在这里处理权限通过的逻辑
                //do something
                Debug.Log("权限申请通过");
            }
        }
    }
    
    /// <summary>
    /// 申请权限被拒绝,且不再询问
    /// </summary>
    /// <param name="permission"></param>
    private void OnPermissionDeniedAndDontAskAgain(string permission)
    {
        Write($"OnPermissionDeniedAndDontAskAgain:{permission}");
    }

    private void Write(string str)
    {
        m_StringBuilder.AppendLine(str);
        txt.text = m_StringBuilder.ToString();
        Debug.Log(m_StringBuilder.ToString());
    }
}

2.2 Agregar permisos a AndroidManifest.xml

Sabemos que los permisos de Android para aplicaciones dinámicas deben definirse en AndroidManifest.xml;
necesitamos agregar nuestros permisos en Assets\Plugins\Android\AndroidManifest.xml, y Unity fusionará automáticamente todos los AndroidManifests;

2.2.1 Obtenga la plantilla AndroidManifest

Si no tiene una plantilla de AndroidManifest, puede obtener una plantilla de AndroidManifest mediante el siguiente método

  • Compruebe Mainfest personalizado en la configuración de publicación
    inserte la descripción de la imagen aquí

2.2.2 Agregar definición de permiso

Después de verificar, Unity generará automáticamente una plantilla en el directorio Assets\Plugins\Android, y luego solo necesitamos agregar los permisos que necesitamos.
inserte la descripción de la imagen aquí

3. Conclusión

A través de los pasos anteriores, puede completar la solicitud de permisos de Android en el lado de Unity;
una cosa a tener en cuenta es, por ejemplo, solicitar varios permisos al mismo tiempo. Por ejemplo, 2, luego aparecerán las ventanas 1/2 y 2/2 para aplicar. Y se volverá a llamar a la interfaz después de que el usuario complete todas las operaciones;
si el usuario está de acuerdo, se volverá a llamar a OnPermissionGranted dos veces, y se debe prestar atención para evitar múltiples devoluciones de llamada. Por ejemplo, el ejemplo anterior usa una variable m_IsGetAllPermission para evitar múltiples devoluciones de llamada;
inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/aaa27987/article/details/131555663
Recomendado
Clasificación