본문 바로가기

개발/Unity

[유니티] 안드로이드 권한관련 문제

-문제발생-

구 버전 프로젝트를 리뉴얼하는 업무를 맡으며 진행중,

테스트과정에서는 문제가 없었으나, 특정 안드로이드 기기로 수행 시 앱이 실행후 바로 종료되는 이슈발생

 

-원인-

로그와, 코드, 구글링결과

안드로이드 13버전 이후 파일 권한요청을 받는 방법이 바뀌었음

참조(https://developer.android.com/about/versions/13/behavior-changes-13?hl=ko)

 

READ_EXTERNAL_STORAGE 대신 분배가 더 세분화되어

READ_MEDIA_IMAGES, READ_MEDIA_VIDEO, READ_MEDIA_AUDIO 로 세분화되었다

 

-해결과정-

1. 기존소스코드에 안드로이드 버전을 체크한 뒤, 분기를 만들어 각 권한허용절차를 다르게 설정

 

2. AndroidManifest 파일에 권한허용 uses permission내용추가

<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
  <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
  <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />

 

3. 코드상 안드로이드 버전을 확인 후 버전에따라 분기처리 실행

string[] permission_etc = {
"android.permission.READ_EXTERNAL_STORAGE",
"android.permission.WRITE_EXTERNAL_STORAGE",
"android.permission.CAMERA",
"android.permission.RECORD_AUDIO" };
    string[] permission_13_up = {
"android.permission.READ_MEDIA_IMAGES",
"android.permission.READ_MEDIA_VIDEO",
"android.permission.READ_MEDIA_AUDIO",
"android.permission.CAMERA",
"android.permission.RECORD_AUDIO" };
    string[] curPermission;
 
 
if (Application.platform == RuntimePlatform.Android)
        {
            AndroidJavaClass buildVersion = new AndroidJavaClass("android.os.Build$VERSION");
            sdkVersion = buildVersion.GetStatic<int>("SDK_INT");

            if (sdkVersion >= 33)
            {
                curPermission = permission_13_up;
            }
            else
            {
                curPermission = permission_etc;
            }

        }

 

4. 이후 permission 얻기 실행

if (!CheckPermissions())
        {
            AndroidPermissionsManager.RequestPermission(curPermission, new AndroidPermissionCallback(
                       grantedPermission =>
                       {
                           //when granted
                           checkCount++;
                           Debug.Log("grant : " + curPermission[checkCount - 1]);
                           Debug.Log("Count : " + checkCount);

                         



                       },
                       deniedPermission =>
                       {
                           //when denied
                           Debug.Log("denied : " + curPermission[checkCount]);
 
                       }));

            CheckPermissions();
        }

 

private bool CheckPermissions()
    {
        if (Application.platform != RuntimePlatform.Android)
        {
            return true;
        }


        for (int i = 0; i < temp.Length; i++)
        {
            if (!AndroidPermissionsManager.IsPermissionGranted(temp[i]))
            {
                return false;
            }

        }

        return true;
    }