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.

Bình luận (0)

Bạn cần đăng nhập để có thể bình luận.

Chưa có bình luận nào. Hãy là người đầu tiên!

Bài viết liên quan

Một ví dụ về tệp AndroidManifest.xml với các quyền và cấu hình phổ biến được chú thích chi tiết. Dùng làm tài liệu tham khảo khi build cho Android.

Mobile
Android
Build
Configuration