본문 바로가기

Android/개념 및 예제

안드로이드 런타임 퍼미션(runtime permissions)

안드로이드 앱 개발 시 TargetSDK가 마시멜로 버전(APK 23) 이상인 경우, 디바이스의 특정 기능을 사용할 때 권한을 요구하는데 그 권한 중에 위험 권한으로 분류된 권한은 개발자가 직접 사용자에게 권한을 허가받을 수 있게 개발해야 합니다.

 

위험 권한(카메라, 오디오 녹음 권한) 허가를 받고 사용자가 허가하지 않은 경우 다시 권한 허가 요청을 하도록 하는 앱을 만들어 보겠습니다.

 

 

 

1. 먼저 manifest 파일에 필요한 앱에서 사용할 위험 권한을 선언합니다.

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

 

 

2. java 코드를 통해서 사용자에게 권한을 허가 받겠습니다.

앱이 실행이 됐을 때 chkPermission() 함수를 통해서 모든 위험 권한을 허가받았을 경우 토스트 메시지를 띄우도록 했습니다. 

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (chkPermission()){
            Toast.makeText(this, "위험 권한 승인함", Toast.LENGTH_SHORT).show();
        }
}	

 

 

chkPermission()에는 hasPermission() 함수를 통해 사용자가 앱에서 선언한 위험 권한을 허가했는지 확인합니다.

위험 권한을 모두 허가받으면 true를 반환하고,

하나라도 받지 못한 경우 ActivityCompat.requestPermissions()를 통해 권한 요청을 합니다.

 

ActivityCompat.requestPermissions()의 파라미터는 

1. 대상 Activity (Activity 객체)

2. 요청할 권한들 (String 배열)

3. 요청 코드 (int)

등으로 구성됩니다.

 

요청 결과는 onRequestPermissionsResult() 함수를 통해 알 수 있습니다.

 public boolean chkPermission() {
        // 위험 권한을 모두 승인했는지 여부
        boolean mPermissionsGranted = false;
        // 승인 받기 위한 권한 목록
        String[] mRequiredPermissions = new String[]{
                Manifest.permission.CAMERA,
                Manifest.permission.RECORD_AUDIO
        };

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            // 필수 권한을 가지고 있는지 확인한다.
            mPermissionsGranted = hasPermissions(mRequiredPermissions);

            // 필수 권한 중에 한 개라도 없는 경우
            if (!mPermissionsGranted) {
                // 권한을 요청한다.
                ActivityCompat.requestPermissions(MainActivity.this, mRequiredPermissions, PERMISSIONS_REQUEST_CODE);
            }
        } else {
            mPermissionsGranted = true;
        }

        return mPermissionsGranted;
}

 

 


onRequestPermissionsResult() 함수는
ActivityCompat.requestPermissions()의 권한 요청 결과를 받습니다.

권한을 승인하지 않은 경우 다시 권한 요청을 통해 권한 요청하도록 했습니다.

 

 @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == PERMISSIONS_REQUEST_CODE) {
            // 권한을 모두 승인했는지 여부
            boolean chkFlag = false;
            // 승인한 권한은 0 값, 승인 안한 권한은 -1을 값으로 가진다.
            for (int g : grantResults) {
                if (g == -1) {
                    chkFlag = true;
                    break;
                }
            }

            // 권한 중 한 개라도 승인 안 한 경우
            if (chkFlag){
                chkPermission();
            }
        }
}

 

전체 소스는 깃헙에서 확인할 수 있습니다.

github.com/keepseung/Android-Blog-Source

 

keepseung/Android-Blog-Source

https://develop-writing.tistory.com/ 에서 제공하는 예제. Contribute to keepseung/Android-Blog-Source development by creating an account on GitHub.

github.com

참고 : developer.android.com/guide/topics/permissions/overview?hl=ko#normal-dangerous