본문 바로가기
Study/Android

android Permission 거부시 다시 묻기

by Answer Choi 2017. 9. 1.
반응형


1. Permission


Android 6.0이후로 Permission은 상당히 중요해 졌습니다.


특히 Permission은 Normal 과 Dangerous로 나뉘는데 개인 프라이버시 침해가능 여부를 


기준으로 합니다.


Dangerous Permission의 경우 사용자가 직접 승인을 하지 않으면, 그 기능을 쓸 수 없습니다.



Dangerous Permission과 Permission group입니다.


해당 Permission을 요청하면 시스템에서는 Permission Group별로 1번만 승인여부를 물어봅니다.


만약 Permission Group이 같은 Permission들을 요청할 경우 한꺼번에 물어봐야 합니다.


만약 SMS 그룹안의 SEND_SMS와 READ_SMS를 각각 요청하면, 처음 요청한 것에 대해서만 


대화상자가 나타나고, 첫번째 승인여부에 따라 2번째도 따라갑니다.


따라서 한번에 물어봐야 합니다.




2. Permission 묻기 구현


사용하는 모든 Permission은 기존과 같이 manifests에서 권한 추가를 해줍니다.


그리고 Dangerous Permission은 Java 파일에서 구현을 하면 됩니다.


Permission은 앱을 최초 실행시 물어주면 제일 좋습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
                Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {
 
    // Should we show an explanation?
    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
            Manifest.permission.READ_CONTACTS)) {
 
        // Show an expanation to the user *asynchronously* -- don't block
        // this thread waiting for the user's response! After the user
        // sees the explanation, try again to request the permission.
 
    } else {
 
        // No explanation needed, we can request the permission.
 
        ActivityCompat.requestPermissions(thisActivity,
                new String[]{Manifest.permission.READ_CONTACTS},
                MY_PERMISSIONS_REQUEST_READ_CONTACTS);
 
        // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
        // app-defined int constant. The callback method gets the
        // result of the request.
    }
}
cs


Line 2~4 : 해당 권한이 사용자에 의해 승인이 되어있지 않았음을 의미합니다.


승인이 되지 않아 하위 if~else문으로 들어옵니다.


Line 7 : 이전에 승인 거절한 경우 들어오게 됩니다.


따라서 이부분에 다시 권한을 승인할 것을 권유하던, 권한이 승인되지 않았을 시 문제점에 대해 


설명해 주면 됩니다.


Line 14 : 최초 실행의 경우 들어오게 됩니다.(이전에 승인 거절한 이력이 있는지 확인합니다.)


이경우에는 팝업을 띄워 권한 승인여부를 물어보게 됩니다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Override
public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                && grantResults[0== PackageManager.PERMISSION_GRANTED) {
 
                // permission was granted, yay! Do the
                // contacts-related task you need to do.
 
            } else {
 
                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            return;
        }
 
        // other 'case' lines to check for other
        // permissions this app might request
    }
}
cs


이 부분은 위에서 팝업창이 띄워지고, 승인과 거절시 결과값을 가지고 호출되어 지는 


부분입니다.


Line 7 : 권한 승인시 들어오고


Line 13 : 권한 거절시 들어오게 됩니다.


여기까지의 과정을 통해 Permission을 승인요청 할 수 있습니다.



1
2
3
4
5
6
7
int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_CALENDAR);
 
if(permissionCheck== PackageManager.PERMISSION_DENIED){
    // 권한 없음
}else{
    // 권한 있음
cs
출처: http://gun0912.tistory.com/55 [박상권의 삽질블로그]

그리고 위와 같이 퍼미션이 있는지 직접 체크도 가능합니다.




3. 미승인시 재요청하기


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
AlertDialog.Builder localBuilder = new AlertDialog.Builder(this);
localBuilder.setTitle("권한 설정")
    .setMessage("권한 거절로 인해 일부기능이 제한됩니다.")
    .setPositiveButton("권한 설정하러 가기", new DialogInterface.OnClickListener(){
        public void onClick(DialogInterface paramAnonymousDialogInterface, int paramAnonymousInt){
            try {
                Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
                    .setData(Uri.parse("package:" + getPackageName()));
                startActivity(intent);
            } catch (ActivityNotFoundException e) {
                e.printStackTrace();
                Intent intent = new Intent(Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS);
                startActivity(intent);
            }
        }})
    .setNegativeButton("취소하기", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface paramAnonymousDialogInterface, int paramAnonymousInt) {
            Toast.makeText(getApplication(),getString(R.string.limit),Toast.LENGTH_SHORT).show();
        }})
    .create()
    .show();
cs


위의 퍼미션 체크 코드를 이용하여 미 체크시 위 코드를 이용하면 권한 설정을 다시 유도할 수 있습니다.



권한설정하러 가기 클릭시 아래와 같이 애플리케이션 정보가 뜨며, 여기서 권한을 재설정 할 수 있습니다.



권한을 클릭하면 아래와 같이 앱권한 화면이 나타납니다.



이 곳에서 권한을 다시 설정하시면 됩니다.


반응형

인기글