ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Android] 권한(Permission)과 위험 권한 요청 방법
    Android 2021. 4. 8. 17:30
    반응형

     

    권한(Permission)이란?

    안드로이드에서는 제한된 데이터 혹은 작업에 대해 개인정보 보호를 위해 사용자로부터 권한을 부여받도록 되어있다.

    매니페스트에서 권한을 선언할 수 있는데, 앱을 설치할 때 사용자가 허용하면 한번에 권한이 부여된다.

     

    앱 권한 선언

    일반 권한의 경우 매니페스트에서 선언하여 설치 시점에서 권한을 부여받을 수 있다.

    앱 권한을 부여하기 위해서는 매니페스트 파일에 <uses-permission> 요소를 추가해야한다.

    아래는 카메라에 접근하기 위한 권한을 추가하는 방법이다.

    <manifest>
    	<uses-permission android:name="android.permission.CAMERA"/>
    	<application ...>
    			...
    	</application>
    </manifest>

     

    +)

    하드웨어와 관련된 권한의 경우, 해당 하드웨어 기기를 선택사항으로 선언할 수 있다.

    <manifest ...>
        <application>
            ...
        </application>
        <uses-feature android:name="android.hardware.camera"
                      android:required="false" />
    <manifest>

    android:required 옵션을 false로 설정하지 않으면 하드웨어 기기가 없다면 앱 자체를 설치할 수 없다.

     

    위험 권한 (런타임 권한)

    마시멜로(API 23)부터는 위험 권한으로 분류된 권한은 설치 시점이 아니라 실행했을 때 권한을 부여받도록 변경되었다.

    대표적으로 위치, 카메라, 마이크, 연락처, 전화, 문자, 일정, 센서 등의 기능이 위험권한으로 분류되어 있다.

     

    앱 권한 요청

    위험 권한을 사용하기 위해서는 일반 권한과 마찬가지로 먼저 매니페스트 파일에서 요청이 필요한 권한을 선언한다.

    <manifest>
    	<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    	<application ...>
    			...
    	</application>
    </manifest>

     

     

    그리고 앱이 실행되는 시점 혹은 권한이 필요한 기능이 호출되는 시점에서 권한을 요청한다.

    아래는 안드로이드 개발자 가이드에서 권장하는 권한 요청을 위한 플로우대로 구현한 코드다.

     

    private String permission = Manifest.permission.ACCESS_COARSE_LOCATION;
    private static final int REQUEST_CODE = 101;
    
    public void checkPermissions(String[] permissions) {
    
        int permissionCheck = ContextCompat.checkSelfPermission(this, permission);
        if (permissionCheck == PackageManager.PERMISSION_DENIED) {
            if (shouldShowRequestPermissionRationale()) {
                //권한 설명 필요
            } else {
                requestPermission(this, new String[] {permission}, REQUEST_CODE);
            }
        } 
    }
    
    
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case REQUEST_CODE:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                   //권한 승인
                }  else {
                   //권한 거부
                }
                return;
            }
        }
    }

     

     

    단계별로 코드를 설명한다면,

     

    1. 사용자가 이미 앱에 권한을 부여했는지 확인

    int permissionCheck = ContextCompat.checkSelfPermission(this, permission);
    if (permissionCheck == PackageManager.PERMISSION_DENIED) {
    	...
    }

    checkSelfPermission() 메서드를 통해 이미 앱에 권한이 부여됐는지 확인할 수 있다.

    이 메서드는 앱에 권한이 있는지에 따라 PERMISSION_GRANTED 또는 PERMISSION_DENIED를 반환한다.

     

     

    2. 사용자에게 권한 요청에 대한 설명 

    if (shouldShowRequestPermissionRationale()) {
    		//권한 설명 필요
    } 

    shouldShowRequestPermissionRationale() 메서드는 사용자에게 권한 설명이 필요한 경우 true를 호출한다.

    메서드 반환값에 따라 권한에 대한 설명 UI를 호출한다.

     

     

    3. 위험 권한 요청

    requestPermission(this, new String[] {permission}, REQUEST_CODE);

    requestPermission()를 호출해서 위험 권한을 요청한다.

    requsetPermission 메서드는 권한을 요청하는 시스템 권한 다이얼로그를 표시하고,

    사용자가 다이얼로그에 응답할 경우 onRequestPermissionsResult() 메서드를 호출한다.

    파라미터로는 컨텍스트, 요청할 권한들을 담은 배열, 개발자가 정의한 요청 코드를 전달한다.

     

     

    4. 사용자 응답 확인

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions,
            int[] grantResults) {
        switch (requestCode) {
            case REQUEST_CODE:
                if (grantResults.length > 0 &&
                        grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    //권한 승인
                }  else {
                    //권한 거부
                }
                return;
            }
        }
    }

    사용자가 응답을 할경우 onRequestPermissionsResult() 메서드가 호출되고, 요청 코드와 함께 응답에 대한 여부가 파라미터로 전달된다.

    여러 요청에 대한 응답을 받을 수 있기 때문에 파라미터의 응답값은 배열형태로 전달된다.

    사용자가 권한을 거부했을 경우에는 어떤 기능을 사용할 수 없는지에 대한 경고 메세지를 표시하는 것이 좋다.

     

     

     

    더보기
    안드로이드 가이드에서 제공하는 위험 권한 요청에 대한 플로우 다이어그램

     

     

     

    +)

    직접 권한 요청 코드를 구현하는 것 뿐만 아니라 외부 라이브러리를 사용하거나, 시스템이 권한 요청 코드를 관리하도록 허용할 수 있다.

     

     

     

     


    [참고] 안드로이드 권한 API 참조 페이지

    [참고] 안드로이드 가이드 - 앱 권한 요청

    댓글