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