본문 바로가기

Android.log

[Marshmallow] 권한 요청 방법

반응형

우선 안드로이드M 이 공개 되면서 여러 변경되거나 추가된 내용 중에서 개인적으로 개발자가 가장 신경써야 할 부분은 "권한"에 대한 부분이라고 생각되어 퍼미션에 대해 제일 먼저 다루겠습니다.


Android Developer

우선 자세한 내용은 Android Developer 사이트에서 자세히 설명해 주고 있고, 안드로이드M에 대해서는 무려 한글페이지를 제공해 주고 있습니다!!!!!!!!!!!!!!!


안드로이드M 이하 버전의 경우 특정 기능을 사용하기 위해서 <uses-permission..>만 정의 하고 설치 시 안드로이드 인스톨러에서 사용자에게 고지 하도록 되어 있습니다.시 안드로이드 인스톨러에서 사용자에게 고지 하도록 되어 있습니다., 


안드로이드M 에서는 퍼미션을 사용하는 시점에 사용자에게 퍼미션 사용여부를 고지 하고 사용자가 동의해야만 사용할 수 있습니다

모든 퍼미션이 이렇게 사용해야 되는 것은 아니고, 개인정보와 관련된 몇몇 퍼미션에 관해서 별도의 처리를 해줘야 합니다.


Developer 사이트에 정의되어있는 별도로 퍼미션 처리를 해줘야하는 퍼미션은 다음과 같습니다.


권한 그룹권한
android.permission-group.CALENDAR
  • android.permission.READ_CALENDAR
  • android.permission.WRITE_CALENDAR
android.permission-group.CAMERA
  • android.permission.CAMERA
android.permission-group.CONTACTS
  • android.permission.READ_CONTACTS
  • android.permission.WRITE_CONTACTS
  • android.permission.READ_PROFILE
  • android.permission.WRITE_PROFILE
android.permission-group.LOCATION
  • android.permission.ACCESS_FINE_LOCATION
  • android.permission.ACCESS_COARSE_LOCATION
android.permission-group.MICROPHONE
  • android.permission.RECORD_AUDIO
android.permission-group.PHONE
  • android.permission.READ_PHONE_STATE
  • android.permission.CALL_PHONE
  • android.permission.READ_CALL_LOG
  • android.permission.WRITE_CALL_LOG
  • com.android.voicemail.permission.ADD_VOICEMAIL
  • android.permission.USE_SIP
  • android.permission.PROCESS_OUTGOING_CALLS
android.permission-group.SENSORS
  • android.permission.BODY_SENSORS
  • android.permission.USE_FINGERPRINT
android.permission-group.SMS
  • android.permission.SEND_SMS
  • android.permission.RECEIVE_SMS
  • android.permission.READ_SMS
  • android.permission.RECEIVE_WAP_PUSH
  • android.permission.RECEIVE_MMS
  • android.permission.READ_CELL_BROADCASTS


개발 방법

테스트로 아래의 두 퍼미션을 정의하며, "android.permission.CALL_PHONE" 의 경우 사용자의 확인이 필요한 퍼미션이고, "android.permission.ACCESS_WIFI_STATE"의 경우 확인이 필요 없는 퍼미션 입니다.


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

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


앱을 설치 하고 안드로이드 설정에서 애플리케이션에셔 보면 CALL_PHONE 에 관해서는 사용자가 퍼미션을 ON/OFF 처리 할 수 있도록 되있습니다. 

 

이제 우리가(개발자들) 해야할일이 생겼죠...!

1. 설정에서 퍼미션 사용이 ON으로 되어있는지 확인

 - checkSelfPermission(String permission)


2. 퍼미션 사용 요청

 - requestPermissions(String[] permissions, int requestCode)

requestPermissions 메서드를 호출 하면 팝업이 뜨면서 사용자에게 퍼미션을 허용을 요청 하게 됩니다.

사용자가 동의 버튼을 선택 할 경우 앱 설정에 퍼미션이 ON으로 바뀌게 됩니다.


 


3. 사용자 응답에 따른 결과 받기

 -  onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults)

PERMISSION_GRANTED 응답을 받았다면, 요청한 퍼미션에 대한 작업을 하시면 됩니다.


예제 소스

아래 테스트 예제를 보시면 쉽게 이해 되실겁니다.


 private final int MY_PERMISSIONS_REQUEST_CALL_PHONE = 1000;

private View.OnClickListener buttonListener = new View.OnClickListener() {
    @Override
    public void onClick(View view) {

        switch (view.getId()) {
            case R.id.BT_CALL_PHONE :

                if (checkSelfPermission(Manifest.permission.CALL_PHONE)
                        != PackageManager.PERMISSION_GRANTED) {
                    requestPermissions(new String[]{Manifest.permission.CALL_PHONE},
                            MY_PERMISSIONS_REQUEST_CALL_PHONE);
                    return;
                } else {
                    callPhone();
                }
                break;

            default:
                break;
        }

    }
};

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_CALL_PHONE: {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, yay! do the
                // calendar task you need to do.
                callPhone();
            } else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.
                Toast.makeText(this, "NOT GRANTED", Toast.LENGTH_LONG).show();
            }
            return;
        }

        // other 'switch' lines to check for other
        // permissions this app might request
    }
}
private void callPhone() {
    Intent i = new Intent(Intent.ACTION_CALL, Uri.parse("tel:010-1234-5678"));
    startActivity(i);
}

 


반응형