본문 바로가기
dev

[Unity] Permission 권한 요청

by #### 2024. 4. 4.
반응형

Android, iOS를 위한 퍼미션 기능을 Wrapping 했습니다.

using Cysharp.Threading.Tasks;
using UnityEngine;
#if PLATFORM_ANDROID
using UnityEngine.Android;
#endif

public class PermissionWrapper
{
    public enum Type
    {
        Camera,
        Microphone,
        FineLocation,
        CoarseLocation,
        ExternalStorageRead,
        ExternalStorageWrite,
    }

    public static bool HasUserAuthorizedPermission(Type type)
    {
#if PLATFORM_ANDROID
        switch (type)
        {
            case Type.Camera: return Permission.HasUserAuthorizedPermission(Permission.Camera);
            case Type.Microphone: return Permission.HasUserAuthorizedPermission(Permission.Microphone);
            case Type.FineLocation: return Permission.HasUserAuthorizedPermission(Permission.FineLocation);
            case Type.CoarseLocation: return Permission.HasUserAuthorizedPermission(Permission.CoarseLocation);
            case Type.ExternalStorageRead: return Permission.HasUserAuthorizedPermission(Permission.ExternalStorageRead);
            case Type.ExternalStorageWrite: return Permission.HasUserAuthorizedPermission(Permission.ExternalStorageWrite);
        }
#elif UNITY_IOS
        switch (type)
        {
            case Type.Camera: return Application.HasUserAuthorization(UserAuthorization.WebCam);
            case Type.Microphone: return Application.HasUserAuthorization(UserAuthorization.Microphone);
        }
#endif
        return true;
    }

    public static async UniTask RequestUserPermission(Type type)
    {
#if PLATFORM_ANDROID
        switch (type)
        {
            case Type.Camera: 
                Permission.RequestUserPermission(Permission.Camera);
                break;
            case Type.Microphone: 
                Permission.RequestUserPermission(Permission.Microphone);
                break;
            case Type.FineLocation: 
                Permission.RequestUserPermission(Permission.FineLocation);
                break;
            case Type.CoarseLocation: 
                Permission.RequestUserPermission(Permission.CoarseLocation);
                break;
            case Type.ExternalStorageRead: 
                Permission.RequestUserPermission(Permission.ExternalStorageRead);
                break;
            case Type.ExternalStorageWrite: 
                Permission.RequestUserPermission(Permission.ExternalStorageWrite);
                break;
        }

#elif UNITY_IOS
        switch (type)
        {
            case Type.Camera:
                await Application.RequestUserAuthorization(UserAuthorization.WebCam);
                break;
            case Type.Microphone:
                await Application.RequestUserAuthorization(UserAuthorization.Microphone);
                break;
        }
#endif

        await UniTask.WaitForSeconds(0.2f);
        await UniTask.WaitUntil(() => Application.isFocused == true);
    }
}

 

 

안드로이드의 경우 AndroidManifest.xml 수정

  1. 유니티에서 자동 권한요청 기능 비활성화

<meta-data android:name="unityplayer.SkipPermissionsDialog" android:value="true" />

 

  2. 권한요청 추가

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
반응형

댓글