박상권의 삽질블로그

[안드로이드/Android]유용한 라이브러리 - TedPermission(마시멜로우 권한체크) 본문

IT/Android-TIP (한글)

[안드로이드/Android]유용한 라이브러리 - TedPermission(마시멜로우 권한체크)

박상권 2016.06.02 13:43



안드로이드 6.0 마시멜로우버전부터 개발자들에게는 귀찮은(?) 변경이 있었습니다.


카메라를 사용하거나 문자를 읽어오는 등의 권한을 사용할때

기존에는 앱을 다운받을때에만 사용자로부터 동의를 받으면 그이후는 마음대로 권한을 사용할 수 있었지만, 

이제는 권한을 사용하는 시점에 사용자에게 권한허가를 받아야 하고 또한 사용자가 언제든지 권한을 켜고끌수 있도록 변경되었습니다.

이 이슈와 관련해서 아래 글을 읽어보시면 좀더 많은 도움이 되실겁니다.


[안드로이드]6.0 마시멜로우 권한체크하고 최적화하기



위의 글의 내용처럼 기본으로 제공되는 권한체크 함수들을 사용하고 이를 구조화해서 잘 만들기에는 많은 시간과 노력이 필요합니다.

권한을 체크하는 같은 코드를 복사/붙여넣기해서 금방금방 할수도 있겠지만 아주 좋지 않은 방식이라고 생각합니다.

(이렇게 코딩하면 우리 직원들은 저한테 1시간동안 갈굼 당합니다)


하지만 걱정할 필요없습니다.

TedPermission이 있다면 권한체크를 아주 간단하고 효과적으로 할 수 있습니다.







TedPermission


https://github.com/ParkSangGwon/TedPermission


사실 TedPermission은 이름에서 보시면 알 수 있듯이 제가 만든 라이브러리입니다.

(제 영어이름이 Ted Park입니다)



이 라이브러리는 제가 수많은 삽질을 거치며 어느정도 구조화해서 만든 권한체크 라이브러리입니다.

기존에 권한체크방식을 설계하고 코딩해보신 분이라면 얼마나 간단하게 줄여졌는지 체감하실 수 있을겁니다.






1. Gradle 추가


dependencies {

compile 'gun0912.ted:tedpermission:2.0.0'
}


RxJava1,RxJava2도 지원합니다.

RxJava를 지원하는 TedPermission은 GitHub에서 직접 확인해주세요

https://github.com/ParkSangGwon/TedPermission





2. PermissionListener 생성


권한이 허가되거나 거부당했을때 결과를 리턴해주는 리스너를 만들어줍니다.

onPermissionGranted()는 권한이 모두 허용 되고나서 실행되며 onPermissionDenied()는 요청한 권한중에서 거부당한 권한목록을 리턴해줍니다.

3개의 권한을 요청했는데 사용자가 1개만 허용하고 2개는 거부한경우 onPermissionDenied()에 2개의 거부당한 권한목록이 전달됩니다.


PermissionListener permissionlistener = new PermissionListener() {
@Override
public void onPermissionGranted() {
Toast.makeText(Activity1.this, "권한 허가", Toast.LENGTH_SHORT).show();
}

@Override
public void onPermissionDenied(ArrayList<String> deniedPermissions) {
Toast.makeText(Activity1.this, "권한 거부\n" + deniedPermissions.toString(), Toast.LENGTH_SHORT).show();
}


};







3. 권한체크 시작


TedPermission 클래스를 이용해서 권한체크를 시작합니다.

이때 리스너, 요청하는 권한, 권한요청시 필요한 메세지들 등에 대해서 설정을 해주는 작업을 해주고 check()함수를 통해서 실제로 권한체크를 시작합니다.


TedPermission.with(this)
.setPermissionListener(permissionlistener)
.setRationaleMessage("구글 로그인을 하기 위해서는 주소록 접근 권한이 필요해요")
.setDeniedMessage("왜 거부하셨어요...\n하지만 [설정] > [권한] 에서 권한을 허용할 수 있어요.")
.setPermissions(Manifest.permission.READ_CONTACTS)
.check();









4. 기타


커스터마이징을 지원하는 함수들을 통해서 원하시는 메세지 혹은 버튼이름을 설정할 수 있습니다.


setRationaleMessage()

- 권한을 요청하기전에 이 권한이 필요한 이유에 대해서 설명하는 메세지를 설정합니다.

- 기본으로 제공되는 shouldShowRequestPermissionRationale()를 이용해서 이 메세지를 보여준다면, 

제일 처음 권한을 요청할때는 false가 리턴되서 rationale 메세지를 보여주지 못하지만 TedPermission은 처음 요청할때도 rationale 메세지를 보여줍니다.


setRationaleConfirmText()

권한이 필요한 이유에 대해서 설명하는 다이어로그에서 [확인]버튼 텍스트를 설정합니다.


setDeniedMessage()

사용자가 권한을 거부했을때 보여지는 메세지를 설정합니다.

- 여기서 다시한번 사용자가 권한을 허용할수있도록 유도하는 효과적인 메세지가 필요할 수도 있습니다


setDeniedCloseButtonText()

거부했을때 보여지는 메세지 다이어로그에서 [닫기]버튼 텍스트를 설정합니다.


setGotoSettingButton()

사용자가 권한을 거부했을때 보여지는 메세지에서 '설정' 화면으로 갈수있는 버튼을 보여줄지 여부를 결정합니다.


setGotoSettingButtonText()

'설정'화면으로 갈수있는 버튼을 보여주는경우 해당 버튼의 텍스트를 설정합니다.









동작원리


TedPermission의 핵심은 투명한 권한체크 Activity를 띄우는데에 있습니다.

권한을 체크하려면 권한을 요청하면 onRequestPermissionsResult() 함수로 대응을 해주어야 하기때문에 권한을 요청하는 경우 이 투명한 Activity에서 권한을 체크하고 결과를 리턴해주는 작업을 해줍니다.

그리고 결과들을 Event bus인 Otto를 이용하여 전달해주고 있습니다.

(RxJava를 지원하면서 Otto는 사용하지 않게되었습니다)



1. 권한체크 액티비티 시작

2. 체크해야할 권한목록을 가져옴

3-1. 이미 해당 권한들이 허가되어있는경우 권한이 허용되었음을 알림

3-2. 허용되어 있지 않은경우 rationale 메세지가 세팅되어있다면 권한이 필요한 이유를 보여주고 권한허가를 요청(그렇지않은경우 바로 권한허가를 요청)

4. onRequestPermissionsResult()에서 거부된 권한목록을 체크

5-1. 거부된권한이 하나도 없는경우는 모두 허가된것으로 판단하고 권한이 허용되었음을 알림

5-2. 하나라도 권한이 허용되지 않은경우 권한이 허용되지 않았음을 알리고 거부된 권한목록을 함께 보냄

6. 여기서 권한이 허용/거부 되었음을 알리는 방법으로는 Otto를 사용해서 Event를 날림



좀더 자세한 동작원리는 직접 TedPermission 프로젝트를 다운받고 살펴보셔도 좋습니다.



(내용이 유용하셨다면 Github 오른쪽위의 [Star]버튼을 눌러주시면 감사하겠습니다

저에게는 별풍선 주시는 효과가 있어요!)



TedPermission를 유용하게 사용하셔서 사용자로부터 모든권한을 허가받으시고 행복한 개발 하셨으면 하는 마음입니다.

사용하시면서 문제가 발생하시거나 좋은 기능을 추가하셨다면 Issues / Pull requests를 보내주시면 감사하겠습니다.

감사합니다.



9 Comments
댓글쓰기 폼