Xin quyền lúc chạy (Full Callback)
Nền tảng:
Mobile
Android
Tags:
Permissions
Configuration
C# Code
using UnityEngine;
#if UNITY_ANDROID
using UnityEngine.Android;
#endif
using System.Collections.Generic;
using System;
public class AndroidPermissionHandler : MonoBehaviour
{
private Action<Dictionary<string, bool>> onPermissionsResultCallback;
public void RequestPermissions(string[] permissions, Action<Dictionary<string, bool>> callback)
{
onPermissionsResultCallback = callback;
#if UNITY_ANDROID && !UNITY_EDITOR
List<string> permissionsToRequest = new List<string>();
foreach (var p in permissions)
{
if (!Permission.HasUserAuthorizedPermission(p))
{
permissionsToRequest.Add(p);
}
}
if (permissionsToRequest.Count > 0)
{
var callbacks = new PermissionCallbacks();
callbacks.PermissionGranted += (p) => { HandlePermissionResult(p, true, permissions.Length); };
callbacks.PermissionDenied += (p) => { HandlePermissionResult(p, false, permissions.Length); };
callbacks.PermissionDeniedAndDontAskAgain += (p) => { HandlePermissionResult(p, false, permissions.Length); };
Permission.RequestUserPermissions(permissionsToRequest.ToArray(), callbacks);
}
else
{
// Nếu tất cả quyền đã được cấp, gọi callback ngay lập tức
Dictionary<string, bool> results = new Dictionary<string, bool>();
foreach (var p in permissions)
{
results[p] = true;
}
onPermissionsResultCallback?.Invoke(results);
}
#else
// Trên Editor hoặc nền tảng khác, giả sử tất cả quyền đều được cấp
Dictionary<string, bool> results = new Dictionary<string, bool>();
foreach (var p in permissions)
{
results[p] = true;
}
callback?.Invoke(results);
#endif
}
private Dictionary<string, bool> _permissionResults = new Dictionary<string, bool>();
private int _resultsCount = 0;
private void HandlePermissionResult(string permission, bool granted, int totalPermissions)
{
_permissionResults[permission] = granted;
_resultsCount++;
if (_resultsCount == totalPermissions)
{
onPermissionsResultCallback?.Invoke(_permissionResults);
// Reset for next request
_permissionResults.Clear();
_resultsCount = 0;
}
}
}
/* --- VÍ DỤ SỬ DỤNG --- */
public class MyGameController : MonoBehaviour
{
public AndroidPermissionHandler permissionHandler;
void Start()
{
string[] permissions = {
Permission.Camera,
Permission.FineLocation,
Permission.Microphone
};
// Cần đảm bảo permissionHandler đã được gán trong Inspector
if(permissionHandler != null)
{
permissionHandler.RequestPermissions(permissions, (results) => {
foreach(var result in results)
{
Debug.Log($"Permission {result.Key} status: {(result.Value ? "Granted" : "Denied")}");
}
if (results.ContainsKey(Permission.Camera) && results[Permission.Camera])
{
// Logic khi có quyền Camera
}
});
}
}
}Một script hoàn chỉnh để kiểm tra và yêu cầu người dùng cấp nhiều quyền cùng lúc trên Android 6.0+, sử dụng callback để xử lý kết quả sau khi người dùng tương tác.