안드로이드 마시멜로부터 권한획득이 변경되었다. 기존의 안드로이드 Manifest에 권한을 선언 해두기만 하면 되었다. 사용자 입장에서는 설치시 해당 권한을 확인 할뿐 설치 후 앱을 사용하면서 해당 권한을 언제 사용하는지 알 수 없다. 구글은 이러한 보안적인 문제점을 해결 하기 위해 권한획득의 시점을 변경 하였다. 관련된 API를 사용하기전 권한을 획득 하는 방식으로 변경하여 사용자는 언제 어느시점에 권한이 필요한지 인지 할 수 있으며 보안적인 문제점을 좀 더 보완할 수 있다는 점이다. 마시멜로 권한 획득 어떻게 대응하는지 알아보자.
퍼미션을 요청한다. 퍼미션을 퍼미션 그룹을 통해 한번에 간소화된 다이얼로그로 창이 뜬다. onRequestPermissionsResult()를 통해 결과값이 Callback된다.
정리
1) ContextCompat.checkSelfPermission()
– 해당권한이 허용되 있는지 체크한다.
2) ActivityCompat.shouldShowRequestPermissionRationale()
– 이미 한번 이라도 거부한 경우 좀 더 상세한 안내페이지를 표시해준다.
– 다시 묻지 않기를 선택 후 거부한 사용자를 위해 안내페이지에 설정으로 바로가는 액션을 준비 해둔다.
3) ActivityCompat.requestPermissions()
– 퍼미션을 요청한 후 Callback되었을때 결과값 또는 checkSelfPermission()을 통해 해당 퍼미션 권한을 획득하면 다음 단계를 실행 한다.
TIP!
퍼미션 권한 획득 후 획득된 퍼미션 그룹과 동일한 퍼미션이 추가 되는 경우
퍼미션이 추가 된 경우 해당 그룹에서 이미 권한을 획득한 사항이라면 requestPermissions()을 호출 하면 아무런 UI없이 onRequestPermissionsResult()를 통해 자동으로 권한이 획득된다.
다시 묻지않기 선택 후 거부시 requestPermissions()을 요청하는 경우
더이상 다이얼로그를 통해 해당 퍼미션의 권한을 요청 할수 없는 상태임으로 안내페이지를 통해 앱 정보->권한에서 해당 권한을 받도록 유도한다.
권한으로 바로가는 링크는 없으며, ACTION_APPLICATION_DETAILS_SETTINGS 액션을 통해 앱 정보페이지로 연결 해주는 정도가 최선이다.
Intent i = new Intent();
i.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
i.addCategory(Intent.CATEGORY_DEFAULT);
i.setData(Uri.parse("package:" + context.getPackageName()));
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
context.startActivityForResult(i, REQUEST_CODE_SETTING_ACTIVITY);
권한 안내 가이드는 아래 구글 머티리얼 디자인 사이트를 참조하자.
https://www.google.com/design/spec/patterns/permissions.html#permissions-request-patterns