一、前言
前段時間還在職的時候,遇到這么一個問題:SDK首次調(diào)起相機接口進行拍照的時候,會調(diào)起2次相機。并在第2次拍照后閃退。
分析了一下,都是發(fā)生在首次獲取權(quán)限時才會發(fā)生,拿到權(quán)限就不會了。并且2臺會發(fā)生這種情況的Android版本都是13。猜測是SDK獲取權(quán)限接口沒有適配好android13,于是嘗試先把TargetAPI降到Android 10. 如下圖,不過還是會閃退。
然后想了另外的辦法,既然SDK是在申請權(quán)限的時候閃退,那我這邊先自己申請好權(quán)限后,再調(diào)SDK的接口,SDK因為已經(jīng)有權(quán)限就不用申請。測試了一下,果然可行,解決了閃退問題。接下來講下怎么在Unity端申請Android權(quán)限
二、操作步驟
申請安卓權(quán)限一般有2種方式:
方式一:通過Android原生Java/Kotlin代碼申請;
方式二:通過UnityAPI進行申請,這種會更方便一點;
我們講下方式二
2.1 Permission.RequestUserPermissions
- Unity 提供了 Permission.RequestUserPermission(申請單個權(quán)限) 和 Permission.RequestUserPermissions(申請多個權(quán)限)來申請權(quán)限。
- 示例代碼如下
/*********************************************
文件: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相關(guān)
public Button btn;
public Text txt;
//申請相關(guān)
private PermissionCallbacks m_PermissionCallbacks;
private StringBuilder m_StringBuilder;
private bool m_IsGetAllPermission;
void Awake()
{
btn.onClick.AddListener(()=>{RequestPermissions();});
}
/// <summary>
/// 申請單一權(quán)限
/// </summary>
private void RequestCameraPermission()
{
if (!Permission.HasUserAuthorizedPermission(Permission.Camera))
{
Permission.RequestUserPermission(Permission.Camera);
}
}
/// <summary>
/// 申請多個權(quán)限
/// </summary>
private void RequestPermissions()
{
if (m_StringBuilder == null)
{
m_StringBuilder = new StringBuilder();
}
else
{
m_StringBuilder.Clear();
}
m_IsGetAllPermission = false;
//申請回調(diào)
m_PermissionCallbacks = new PermissionCallbacks();
m_PermissionCallbacks.PermissionDenied += OnPermissionDenied;
m_PermissionCallbacks.PermissionGranted += OnPermissionGranted;
m_PermissionCallbacks.PermissionDeniedAndDontAskAgain += OnPermissionDeniedAndDontAskAgain;
//申請權(quán)限組
string[] permissions =
{
Permission.Camera,
Permission.ExternalStorageRead,
Permission.ExternalStorageWrite,
// 添加其他權(quán)限
};
//執(zhí)行申請多個權(quán)限
Permission.RequestUserPermissions(permissions,m_PermissionCallbacks);
}
/// <summary>
/// 申請權(quán)限被拒絕
/// </summary>
/// <param name="permission"></param>
private void OnPermissionDenied(string permission)
{
Write($"OnPermissionDenied:{permission}");
}
/// <summary>
/// 申請權(quán)限成功
/// </summary>
/// <param name="permission"></param>
private void OnPermissionGranted(string permission)
{
Write($"OnPermissionGranted:{permission}");
//檢查權(quán)限是否全部通過
if (Permission.HasUserAuthorizedPermission(Permission.Camera) &&
Permission.HasUserAuthorizedPermission(Permission.ExternalStorageRead) &&
Permission.HasUserAuthorizedPermission(Permission.ExternalStorageWrite))
{
//一次申請多個權(quán)限,比如申請2個。會依次彈窗進行申請,在全部交互完成后才開始回調(diào)接口。如若玩家全部同意。這里會回調(diào)2次
//所以這里需要加個變量防止重復(fù)回調(diào)
if (!m_IsGetAllPermission)
{
m_IsGetAllPermission = true;
//在這里處理權(quán)限通過的邏輯
//do something
Debug.Log("權(quán)限申請通過");
}
}
}
/// <summary>
/// 申請權(quán)限被拒絕,且不再詢問
/// </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 把權(quán)限添加到AndroidManifest.xml
我們知道動態(tài)申請的Android權(quán)限,是需要先定義到AndroidManifest.xml里面的;
我們需要在Assets\Plugins\Android\AndroidManifest.xml 添加我們的權(quán)限,Unity會自動合并所有的AndroidManifest;
2.2.1 獲取 AndroidManifest 模板
如果你沒有一個AndroidManifest模板,可以通過以下方法獲得一個AndroidManifest模板
- 勾選Publishing Settings里的Custom Mainfest
2.2.2 添加權(quán)限定義
勾選后Unity會自動生成一個模板到Assets\Plugins\Android目錄下,接著我們只需要追加我們需要的權(quán)限就好了文章來源:http://www.zghlxwxcb.cn/news/detail-618947.html
三、結(jié)語
通過以上步驟,就可以在Unity端完成申請andorid權(quán)限了;
有一點需要注意的是,比如同時申請多個權(quán)限。比如2個,那么會依次彈起1/2,2/2窗口進行申請。并在用戶全部操作完后,才會回調(diào)接口;
若用戶都點了同意,那么OnPermissionGranted會回調(diào)2次,需要注意防止多次回調(diào)。比如上面示例用了一個m_IsGetAllPermission變量來防止多次回調(diào);文章來源地址http://www.zghlxwxcb.cn/news/detail-618947.html
到了這里,關(guān)于Unity 在Unity端申請Android權(quán)限的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!