[Manifest]Permission

Android 앱은 액세스가 제한된 샌드박스에서 실행됩니다. 그래서 해당 샌드박스 밖에 있는 리소스나 정보를 앱이 사용해야 하는 경우에는 앱이 적절한 권한을 요청해야 합니다. 앱에 권한이 필요하다고 선언하려면 권한을 앱 manifest에 표시한 후 사용자가 런타임에 각 권한을 승인하도록 요청해야 합니다. (Android 6.0 이상)

 

Android 6.0미만의 버전에서는 manifest.xml 파일에 <uses-permission>을 삽입하여 권한을 추가해 주기만 하면 되었습니다. 그러나 6.0이상에서는 권한의 protection level에 따라 권한이 danger로 간주되면 사용자가 명시적으로 앱 액세스 권한을 부여해 주어야 합니다. normal로 간주된 권한은 설치 시 시스템에서 즉시 권한을 부여합니다.

 

현재 안드로이드에서 제공하는 permission의 종류는 140여개 입니다. 아래 링크에서 확인 할 수 있습니다.

 

Manifest.permission  |  Android 개발자  |  Android Developers

Manifest.permission public static final class Manifest.permission extends Object java.lang.Object    ↳ android.Manifest.permission Summary Constants String ACCEPT_HANDOVER Allows a calling app to continue a call which was started in another app. String ACC

developer.android.com

 

안드로이드 문서에는 아래와 같이 권한들이 정의되어 있는데 어떤 권한은 Protection level이 normal 어떤 것은 dangerous로 정의 되어있는 것을 확인 할 수 있습니다. dangerous는 앱이 사용자의 개인 정보를 포함하거나 이용자의 저장된 데이터나 다른 앱의 작업에 영햐을 미칠 수 있는 데이터나 리소르를 필요로 하는 권한을 말합니다.

 

 

 

그러면 앱 권한 확인 및 권한 요청을 하는 방법에 대해 알아보겠습니다.

 

1. Manifest에 권한 추가

 

Android 모든 버전에서 앱에 권한이 필요하다고 선언하려면 앱 manifest에 최상위 <manifest> 요소의 하위 요소로 <uses-permission>을 삽입해야 합니다.

 

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
            package="com.example.snazzyapp">

        <uses-permission android:name="android.permission.INTERNET"/>
        <!-- other permissions go here -->

        <application ...>
            ...
        </application>
</manifest>
    

 

normal 레벨의 권한은 manifest에 등록만 해줘도 되지만, danger 레벨의 권한은 해당 권한이 요구되는 작업을 할 때마다 권한이 있는지 확인해야 합니다. 권한이 있는지 확인하려면 ContextCompat.checkSelfPermission() 메서드를 호출합니다.

 

2. 권한 확인

 

아래는 캘린더 쓰기에 대한 권한을 가졌는지 확인하는 방법입니다.  앱에 권한이 있는 경우에는 PERMISSION_GRANTED를 반환하고, 권한이 없는 경우는 PERMISSION_DENIED를 반환합니다. 권한이 없는 경우에는 앱에서 사용자에게 명시적으로 권한을 요청해야 합니다.

 

    if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_CALENDAR)
            != PackageManager.PERMISSION_GRANTED) {
        // Permission is not granted
    }
    

 

3. 앱에 필요한 권한 요청

 

앱에 필요한 권한이 아직 없다면 requestPermissions()를 사용해서 적절한 권한을 요청해야 합니다. requestPermission()의 정의는 아래와 같이 되어 있습니다. 사용자가 권한 요청 메시지에 응답하면 시스템은 그 결과를 가지고 앱의 콜백 메서드 (onRequestPermissionResult)를 호출합니다. 이 때 requestPermissions에 보냈던 requsetCode가 전달 됩니다.

 

 

    if (ContextCompat.checkSelfPermission(thisActivity,
    Manifest.permission.READ_CONTACTS)
            !=PackageManager.PERMISSION_GRANTED)
    {

        //권한이 승인이 되지 않은 상태
        //사용자가 퍼미션 거부를 한 적이 있는 경우
        if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
                Manifest.permission.READ_CONTACTS)) {
            // 사용자에게 왜 권한이 필요한지 설명해 줄 필요가 있음
            // 설명 해 준 뒤 resuestPermission으로 권한 요청
            // 시스템이 표시하는 메시지는 특정 권한이 아닌 앱이 액세스 해야하는 권한 그룹을 설명
        } else {
        	//사용자가 퍼미션 거부를 한 적이 없는 경우
            ActivityCompat.requestPermissions(thisActivity,
                    arrayOf(Manifest.permission.READ_CONTACTS),
                    MY_PERMISSIONS_REQUEST_READ_CONTACTS)     
        }
    } else
    {
        // 권한이 승인 된 상태
    }

 

4. 권한 요청 응답 처리

 

사용자가 앱 권한 요청에 응답하면 시스템은 앱의 onRequestPermissionResult() 메서드를 호출하여 사용자 응답을 전달합니다. 앱은 해당 메서드를 재정의하여 권한이 부여되었는지 확인해야 합니다. 이 콜백에는 requestPermissions()에 전달한 것과 동일한 요청 코드가 전달됩니다.

 

override fun onRequestPermissionsResult(requestCode: Int,
            permissions: Array<String>, grantResults: IntArray) {
        when (requestCode) {
            MY_PERMISSIONS_REQUEST_READ_CONTACTS -> {
                // 권한 요청이 취소되면 빈 array가 전달됩니다.
                if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
                    //권한승인 완료
                } else {
                    //권한승인 취소.
                }
                return
            }
            else -> {
            }
        }
    }

 

5. 권한 그룹

 

권한을 요청 할 때, 시스템이 표시하는 대화상자에서는 앱이 액세스해야 하는 권한 그룹을 설명하며 특정 권한은 나열하지 않습니다. 예를 들어, READ_CONTACTS 권한을 요청하면 시스템 대화상자에는 앱이 기기의 연락처에 액세스해야 한다는 메시지만 표시됩니다. 사용자는 각 권한 그룹에 한 번만 권한을 부여하면 됩니다. 앱이 해당 그룹에 있는 다른 권한 (앱 Manifest.xml에 나열된 다른 권한)을 요청 하면 시스템이 자동으로 권한을 부여합니다. 권한을 요청하면 시스템은 사용자가 시스템 대화상자를 통해 명시적으로 요청을 승인했을 때와 같은 방식으로 onRequestPermissionResult() 콜백 메서드를 호출하고 PERMISSION_GRANTED를 전달합니다.

 

예를 들어, READ_CONTACTS와 WRITE_CONTACTS를 앱 manifest에 나열한다고 가정합니다. 앱이 READ_CONTACTS를 요청하고 사용자가 권한을 부여한 다음 WRITE_CONTACTS를 요청하면 시스템은 사용자와의 상호작용 없이 즉시 앱에 권한을 부여합니다.

 

 

댓글



Designed by JB FACTORY