본문 바로가기
프로그래밍/안드로이드

[안드로이드] Permission 권한 요청 방법

by 천상IT 2021. 12. 30.
반응형

안드로이드에서 카메라나 주소록접근 등 특정 기능을

사용하기 위해서는 권한을 설정해야합니다.

 

마시멜로우 이전 버전에서는 매니페스트 파일에 권한을 넣어주기만 하면 바로 사용이 가능했지만

보안이 강화되어 이제는 사용자의 승인이 필요하게 변경되었습니다.

 

이런 다이어로그에서 권한을 승인받아야 비로서 해당 권한이 사용가능해집니다.

 

 

그럼 안드로이드에서 권한을 취득하는 방법과 샘플예제를 통해 권한을 취득해 보도록 하겠습니다.

 

안드로이드 권한 관련해서는 아래의 매뉴얼을 참고 부탁드려요~

https://developer.android.com/guide/topics/permissions/overview#normal-dangerous

 

Android에서의 권한  |  Android 개발자  |  Android Developers

Android에서의 권한 앱 권한은 다음 항목에 대한 액세스를 보호하여 사용자 개인정보 보호를 지원합니다. 제한된 데이터(예: 시스템 상태 및 사용자의 연락처 정보) 제한된 작업(예: 페어링된 기기

developer.android.com

 

 

먼저, AndroidManifest.xml 매니페스트 파일에 요청 권한을 선언해줍니다.

마시멜로우 이전에는 이렇게 선언만 해주면 사용이 가능했습니다.ㅜ_ㅜ

<!-- 퍼미션(permission) 정의 -->
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />

 

이제 권한승인 다이어로그를 표시하기 위해 가장 먼저 실행되는 Activity에 권한관련 선언을 해주세요.

//권한 요청 코드
private final int PERMISSIONS_REQUEST_CODE = 100;
// 앱을 실행하기 위해 필요한 퍼미션을 정의합니다.
private final String[] REQUIRED_PERMISSIONS  = { Manifest.permission.RECEIVE_SMS,
                                                 Manifest.permission.READ_CONTACTS };

 

 

저는 onStart()에 권한승인 관련 메소드를 선언해두었습니다.

혹여 사용자가 권한을 거부하더라도 다시 Activity가 onStart상태가 될 때 권한을 체크하고 다시 승인을 받을 수 있도록

반복해서 권한을 체크하도록 말이죠.

 

@Override
protected void onStart() {
    super.onStart();
    checkAppPermission();
}

 

 

그럼 체크메소드를 알아보겠습니다.

안에 번호로 커맨트를 달아두었습니다. 사용자가 권한을 승인하는 경우, 거부한 경우

그리고 거부했는데 다음 실행시 권한승인을 재요청하는 경우 등

흐름이 정리되어 있으니 아래 샘플코드를 참고해주세요.

public void checkAppPermission(){
    try {
        //퍼미션 체크 ActivityCompat.checkSelfPermission(Context, String)
        //퍼미션 요청 ActivityCompat.requestPermissions(Activity, String[], int)
        //퍼미션 요청 콜백함수 ActivityCompat.OnRequestPermissionsResultCallback
        int receiveSMSPermission = ContextCompat.checkSelfPermission(this, REQUIRED_PERMISSIONS[0]);
        int readContactsPermission = ContextCompat.checkSelfPermission(this, REQUIRED_PERMISSIONS[1]);

        // 1. 퍼미션을 가지고 있는지 체크합니다.
        if ( receiveSMSPermission == PackageManager.PERMISSION_GRANTED &&
                readContactsPermission == PackageManager.PERMISSION_GRANTED ) {
            // 2. 이미 퍼미션을 가지고 있다면( 안드로이드 6.0 이하 버전은 런타임 퍼미션이 필요없기 때문에 이미 허용된 걸로 인식합니다.)

        }else {  //2. 퍼미션 요청을 허용한 적이 없다면 퍼미션 요청이 필요합니다. 2가지 경우(3-1, 4-1)가 있습니다.

            // 3-1. 사용자가 퍼미션 거부를 한 적이 있는 경우에는
            if (ActivityCompat.shouldShowRequestPermissionRationale(this, REQUIRED_PERMISSIONS[0]) ||
                    ActivityCompat.shouldShowRequestPermissionRationale(this, REQUIRED_PERMISSIONS[1])) {

                // 3-2. 요청을 진행하기 전에 사용자가에게 퍼미션이 필요한 이유를 설명해줄 필요가 있습니다.
                Snackbar.make(findViewById(R.id.main_layout),  res.getString(R.string.MainActivity_permission_allow),
                        Snackbar.LENGTH_INDEFINITE).setAction(res.getString(R.string.MainActivity_permission_ok), new View.OnClickListener() {

                    @Override
                    public void onClick(View view) {
                        // 3-3. 사용자에게 퍼미션 요청을 합니다. 요청 결과는 onRequestPermissionResult에서 수신됩니다.
                        ActivityCompat.requestPermissions(MainActivity.this, REQUIRED_PERMISSIONS, PERMISSIONS_REQUEST_CODE);
                    }
                }).show();
            } else {
                // 4-1. 사용자가 퍼미션 거부를 한 적이 없는 경우에는 퍼미션 요청을 바로 합니다.
                // 요청 결과는 onRequestPermissionResult에서 수신됩니다.
                ActivityCompat.requestPermissions(MainActivity.this, REQUIRED_PERMISSIONS, PERMISSIONS_REQUEST_CODE);
            }
        }
    }catch(Exception e){
        DebugPrint.ExceptionLog(CommDefine.DEBUG_TAG, e);
    }
}

 

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grandResults) {

    if ( requestCode == PERMISSIONS_REQUEST_CODE && grandResults.length == REQUIRED_PERMISSIONS.length) {

        // 요청 코드가 PERMISSIONS_REQUEST_CODE 이고, 요청한 퍼미션 개수만큼 수신되었다면
        boolean check_result = true;

        // 모든 퍼미션을 허용했는지 체크합니다.
        for (int result : grandResults) {
            if (result != PackageManager.PERMISSION_GRANTED) {
                check_result = false;
                break;
            }
        }

        if ( check_result ) {
            // 모든 퍼미션을 허용했다면
        }
        else {
            // 사용자가 거부만 선택한 경우에는 앱을 다시 실행하여 허용을 선택하면 앱을 사용할 수 있습니다.
            // 거부한 퍼미션이 있다면 앱을 사용할 수 없는 이유를 설명해주고 앱을 종료합니다.2 가지 경우가 있습니다.
            if (ActivityCompat.shouldShowRequestPermissionRationale(this, REQUIRED_PERMISSIONS[0]) ||
                ActivityCompat.shouldShowRequestPermissionRationale(this, REQUIRED_PERMISSIONS[1])) {

                // 사용자가 거부만 선택한 경우에는 앱을 다시 실행하여 허용을 선택하면 앱을 사용할 수 있습니다.
                Snackbar.make(findViewById(R.id.main_layout), res.getString(R.string.MainActivity_permission_allow),
                        Snackbar.LENGTH_INDEFINITE).setAction(res.getString(R.string.MainActivity_permission_ok), new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        ActivityCompat.requestPermissions(MainActivity.this, REQUIRED_PERMISSIONS, PERMISSIONS_REQUEST_CODE);
                    }
                }).show();

            }else {
                // “다시 묻지 않음”을 사용자가 체크하고 거부를 선택한 경우에는 설정(앱 정보)에서 퍼미션을 허용해야 앱을 사용할 수 있습니다.
                Snackbar.make(findViewById(R.id.main_layout), res.getString(R.string.MainActivity_permission_allow2),
                        Snackbar.LENGTH_INDEFINITE).setAction(res.getString(R.string.MainActivity_permission_ok), new View.OnClickListener() {

                    @Override
                    public void onClick(View view) {
                        //설정가서 직접 풀기
                        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                        Uri uri = Uri.fromParts("package", getPackageName(), null);
                        intent.setData(uri);
                        startActivity(intent);
                    }
                }).show();
            }
        }
    }//onRequestPermissionsResult

}

 

 

참고로 resource의 stringxml파일의 문자는 아래를 참고해주세요~

<string name="MainActivity_permission_ok">확인</string>
<string name="MainActivity_permission_allow">이 앱의 모든 기능을 이용하려면 권한허용이 필요합니다.</string>
<string name="MainActivity_permission_allow2">필수권한의 허용이 필요합니다. 설정(앱 정보)에서 앱의 필수권한을 허용해주세요.</string>

 

 

안드로이드 권한 승인 처음이 어렵지 한번 해보면 다음부터는 금방 작성이 가능합니다~

 

 

 

이상 안드로이드 권한요청방법에 대해 알아보았습니다.

반응형

댓글