woong's
Android Marshmallow 6.0 권한 사용하기 본문
Android Marshmallow 6.0 권한 사용하기
마시멜로우가 나온지도 시간이 많이 지난것 같습니다. 마시멜로우로 올라오면서 권한에 대한 부분이
앞으로 신경써야 할부분으로 크게 변경 된것 같습니다. 필자도 마시멜로우 권한 대처 방법에 대해서
학습을 해야겠다 생각은 계속 해왔으나, 마시멜로우 버전을 구하기가 쉽지 않은 환경이여서 테스트가
용이하지 못했습니다. 몇일전에 S6 가 메시멜로우로 업그레이드 되어서 늦게나마 정리해보려 합니다.
마시멜로우로 올라오면서 권한이 강제가 아닌 사용자로부터 유동적으로 변경이 가능하게 변겨이 되었습니다.
이로 인해서 개발자는 사용자가 권한을 OFF 했을시에 대한 대처 코드를 작성해야 합니다. 대처 방법에 대해
알아 보고 대처방법에 대한 코드를 간략히 설명해 보겠습니다.
퍼미션을 다 체크해야 되나 ?? 아닙니다.
퍼미션에도 레벨이 존재하여 DANGEROUS 레벨의 퍼미션을 체크 해야 합니다.
아래의 퍼미션이 아닌 경우는 manifast.xml 에 정의만 하면 바로 사용 할수있지만 ,
아래 DANGEROUS 퍼미션 경우 사용자의 허용이 필요한 퍼미션 입니다.
사용자의 허용 권한이 필요한 DANGEROUS 퍼미션
필자는 위 퍼미션중 STORAGE 퍼미션을 통해서 퍼미션 권한 체크에 대해서 설명해보도록 하겠습니다.
퍼미션 동작과정
- 사용자가 앱을 설치
- 퍼미션이 필요한 기능 호출
- 퍼미션 허용 팝업
- 퍼미션 거절
- 퍼미션 재요청
- 퍼미션 허용
위와 같은 동작과정을 살펴보면서 코드를 작성해 보도록 하겠습니다.
- 사용자가 앱을 설치
사용자가 앱을 설치를 하면 기존에는 모든 퍼미션을 보여주고, 해당퍼미션을 허용해야만
설치가 진행되었습니다. 히지만 이제는 그렇기 진행이 되지 않습니다. 앱이 설치가 되고
허용이 필요한 퍼미션은 모두 OFF 상태가 되어있습니다.
위와 같이 OFF 상태이기 때문에 필요한 부분에 체크 로직이 들어가야 합니다.
프로젝트를 생성하고 화면에 버튼이 하나가 있는 화면을 만들어보았습니다.
버튼을 선택하면 파일쓰기를 실행하는 앱을 구성해 보았습니다.
퍼미션을 Manifast.xml 에 정의를 했음에도 퍼미션 deny가 발생합니다.
1 2 | java.io.IOException: open failed: EACCES (Permission denied) | cs |
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 27 | /** * 퍼미션 체크 */ private void checkPermission(){ //권한이 없는 경우 if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED ||checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){ //최초 거부를 선택하면 두번째부터 이벤트 발생 & 권한 획득이 필요한 이융를 설명 if (shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)) { Toast.makeText(this, "shouldShowRequestPermissionRationale", Toast.LENGTH_SHORT).show(); } //요청 팝업 팝업 선택시 onRequestPermissionsResult 이동 requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, APP_PERMISSION_STORAGE); } //권한이 있는 경우 else{ writeFile(); } } | cs |
버튼 이벤트가 발생 했을시에 퍼미션을 체크 합니다.
checkSelfPermission() 을 통해서 해당 퍼미션이 있는지 확인합니다.
권한이 있는경우에 else 문을 통해서 해당 기능이 동작을 잘할것 입니다. 하지만
마시멜로우 버젼 앱을 설치시 기본적으로 OFF 상태이므로 처음에는 권한이 없을것입니다.
권한이 없는 경우에 requestPermissions() 를 요청 하면 사용자에게 해당
퍼미션 거부할건지 , 허용할건지 팝업이 나타 납니다. 여기서 사용자가 거부를 하고
다시 해당 기능을 사용하기위해 버튼을 선택하면 shouldShowRequestPermissionRationale()
에 이벤트가 호출이 되어 해당 사용자에게 이퍼미션이 왜 필요한지 설명을 할수 있습니다.
사용자가 허용을 하면 onRequestPermissionsResult() 가 호출이 됩니다.
사용자가 거부한 경우
기능 사용 -> checkSelfPermission() -> requestPermissions() -> 거부 ->
기능 사용 -> checkSelfPermission() -> shouldShowRequestPermissionRationale() -> requestPermissions()
사용자가 허용한 경우
기능 사용 -> checkSelfPermission() -> requestPermissions() -> 허용 -> onRequestPermissionsResult()
위와 같이 동작 합니다. 허용을 한경우는
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case APP_PERMISSION_STORAGE: //권한이 있는 경우 if (grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) { writeFile(); } //권한이 없는 경우 else { Toast.makeText(this, "Permission always deny", Toast.LENGTH_SHORT).show(); } break; } } | cs |
권한이 있으면 퍼미션 기능을 호출하고 권한이 없는 경우 문구를 통해서 사용자에게 피드백을 합니다.
이와같이 허용을 통해서 퍼미션 기능을 사용하면 기능동작이 잘되는것을 볼수 있습니다.
p.s)
배포된 앱이 마시멜로우 버전 보다 낮은 경우
롤리팝 버전에서 마시멜로우로 업데이트 경우 기존의 앱의 퍼미션은 ON 상태로 나타나서 크게 문제가 되지
않습니다. 하지만 사용자가 설정을 통해 OFF 하는 경우가 문제가 발생 됩니다. 또한 앱을 삭제하고 다시 설치시
OFF 상태로 시작이 됩니다. 그러므로 빨리 대응해서 마시멜로우 버전을 지원하는게 맞을것 같습니다.
배포된 앱이 마시멜로우 지원 경우
배포된 앱이 마시멜로우 지원경우는 퍼미션 체크를 통해서 퍼미션 ON/OFF에 관하여 처리가 되어있습니다.
하지만 마시멜로우 하위 버전의 경우는 checkSelfPermission() 을 지원하지 않기 때문에 앱이 죽습니다.
분기를 통해서 마시멜로우 버전인 경우만 퍼미션체크를 할수 있도록 지원해야 할것 같습니다.
1 2 | if(Build.VERSION.SDK_INT >=23) { } | cs |
마무리
사용자 입장에서는 위와 같은 퍼미션 허용을 통해서 사용자의 개인정보 및 보안에 대해 좀더 좋아 진것 같습니다.
하지만 앱을 잘 사용하지 못하는 어르신분들에게는 단점이 될수 있다는 생각도 들긴합니다.
개발자 입장에서는 할일이 늘어난 경우가 되겠네요. 하지만 이와같이 사용자의 판단하에 정보를 이용하는게
개인정보 유출또는 해킹에대해 방지할수 있어 당연하다 생각합니다.
'Develop > Android' 카테고리의 다른 글
Android Junit Test Jacoco Tool 사용하기 (0) | 2016.03.11 |
---|---|
Android Kotlin 사용하기 (0) | 2016.03.10 |
Android Touch Intercept 사용하기 (3) | 2016.02.14 |
Android viewpager indicator 사용하기 (14) | 2016.02.14 |
Adnroid 날짜 선택 Widget 사용하기 (1) | 2016.02.14 |