3가지 메소드로 끝내는 안드로이드 마시멜로 권한 획득


안드로이드 마시멜로부터 권한획득이 변경되었다. 기존의 안드로이드 Manifest에 권한을 선언 해두기만 하면 되었다. 사용자 입장에서는 설치시 해당 권한을 확인 할뿐 설치 후 앱을 사용하면서 해당 권한을 언제 사용하는지 알 수 없다. 구글은 이러한 보안적인 문제점을 해결 하기 위해 권한획득의 시점을 변경 하였다. 관련된 API를 사용하기전 권한을 획득 하는 방식으로 변경하여 사용자는 언제 어느시점에 권한이 필요한지 인지 할 수 있으며 보안적인 문제점을 좀 더 보완할 수 있다는 점이다. 마시멜로 권한 획득 어떻게 대응하는지 알아보자.

권한 획득은 3가지의 지원되는 메소드만 이용하면 간단하게 대응 할 수 있다.

ContextCompat.checkSelfPermission(Context context, String permission)

해당 퍼미션의 상태를 체크한다. 메소드를 이용하여 퍼미션이 허용되었는지 거부된 퍼미션인지 체크 할 수 있다. 단, 마시멜로 이전 버전으로 빌드된 앱이 마시멜로를 타겟으로 빌드된 앱으로 업데이트 설치된 사용자의경우 기존의 모든 퍼미션은 허용되어 있다.

Manifest.permission.*에 모든 퍼미션이 정의되어 있으며, PERMISSION_GRANTED(허용된 퍼미션), PERMISSION_DENIED(거부된 퍼미션)으로 결과값이 리턴된다.

ActivityCompat.shouldShowRequestPermissionRationale(Context context, String permission)

사용자가 권한 요청을 한번이라도 거부한 경우를 알 수 있다. 사용자가 권한에 대한 의심으로 인해 거부하는 경우 좀더 상세한 안내를 표시 해줄 수 있다. 최초 퍼미션 요청시에는 false를 리턴한다.

ActivityCompat.requestPermissions(Activity activity, Stringp[] permission, int requestCode)

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

퍼미션을 요청한다. 퍼미션을 퍼미션 그룹을 통해 한번에 간소화된 다이얼로그로 창이 뜬다. 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

 

추가 참고:
http://googledevkr.blogspot.kr/2015/09/android60runtimepermission.html

http://developer.android.com/intl/ko/guide/topics/security/permissions.html#normal-dangerous

 




디자이너 없이 머티리얼 아이콘 쉽게 제작하기

안드로이드 머티리얼 디자인이 발표 된지 이제 2년이라는 시간이 지났다. 머티리얼 디자인은 단순함을 추구하고 아주 심플한 디자인이다. 아이콘또한 2가지 이상의 색상으로 표현하지 않는 정말 한순화된 디자인 스타일이다. 이렇게 머티리얼 디자인은 개발자에게는 기회이다.

구글에서 안드로이드의 아이콘 리소스를 엄청난 양으로 공개한 마당이 이를 활용한다면 디자이너 없이 머티리얼 디자인의 앱을 만들 수 있다. 이번에 소개 할 아이콘을 제작도구또한 마찬가지다. 단순한 머티리얼 디자인이기때문에 이렇게 툴을 통해서 아이콘을 제작할 수 있도록 만들 수 있었다.

해당 툴을 이용하면 머티리얼 아이콘을 단숨에 만들 수 있다. SVG파일이나 기존의 구글에서 아이콘 리소스를 공개한것으로 사용가능하다. 다양한 설정값을 조절해가면서 마음에 드는 아이콘을 쉽게 제작할 수 있다.

http://bitdroid.de/Android-Material-Icon-Generator/

이툴은 깃허브를 통해 소스도 오픈되어 있다.

안드로이드 머티리얼 디자인 위젯 오픈소스 21가지

안드로이드 롤리팝이 발표되면서 머티리얼 디자인에 대한 관심과 함께 관련된 위젯이 오픈소스로 많이 공개되었다. 얼마 전까지만 해도 디자인적인 부분만을 고려해서 개발되어 었다면 이제는 성능도 함께 고려하여 성능이 우수한 위젯들이 속속 등장/업데이트되고 있는 추세다. 자신의 앱을 하위 호환성까지 유지해가며 머티리얼 디자인으로 바꿀 수 있는 유용한 위젯들을 몇 가지 소개한다.

 

1. MaterialDesignLibrary 머티리얼 관련된 위젯 모음
https://github.com/navasmdc/MaterialDesignLibrary#flat-button

 

2. MaterialEverywhere AppCompat 21 적용 예제 (블로그)
https://github.com/antoniolg/MaterialEverywhere

 

3. MaterialWidget Android 4.0 ~ 4.4에서 사용할 수 있는 머티리얼 관련 위젯 모음
https://github.com/keithellis/MaterialWidget

 

4. MaterialTabs 머티리얼 스타일의 탭바
https://github.com/neokree/MaterialTabs

 

5. material-ripple View에 Ripple 효과
https://github.com/balysv/material-ripple

 

6. RippleEffect View에 Ripple, Zoom 등 다양한 효과 (API 9+)
https://github.com/traex/RippleEffect

 

7. LDrawer Appcompat 21 툴바의 ArrowDrawable
https://github.com/ikimuhendis/LDrawer

 

8. material-design-icons 구글이 공개한 아이콘 모음
https://github.com/google/material-design-icons

 

9. AndroidMaterialDesignToolbar 머티리얼 디자인의 다양한 위젯을 적용한 예제
https://github.com/tekinarslan/AndroidMaterialDesignToolbar

 

10. MaterialEditText 머티리얼 디자인의 텍스트 입력 위젯
https://github.com/rengwuxian/MaterialEditText

 

11. material-menu Path Animation으로 툴바의 메뉴, 선택, 이전버튼
https://github.com/balysv/material-menu

 

12. material-dialogs Dialog를 상속받아 커스텀 레이아웃으로 구현한 머티리얼 디자인의 다이얼로그
https://github.com/afollestad/material-dialogs

 

13. MaterialNavigationDrawer Navigation Drawer를 쉽게 사용 할 수 있도록 Activity를 구현. 또한 Drawer 내 구현해 놓은 섹션을 쉽게 추가 가능.
https://github.com/neokree/MaterialNavigationDrawer

 

14. MaterialDialog 머티리얼 디자인의 다이얼로그로 일반 텍스트, 리스트, 입력 텍스트등 다양한 형태 지원(API 8+)
https://github.com/drakeet/MaterialDialog

 

15. materialish-progress 머티리얼 디자인의 로딩 프로그래스(API 9+)
https://github.com/pnikosis/materialish-progress

 

16. MaterialList CardView를 머티리얼 디자인 가이드라인에 맞는 다양한 형태를 지원
https://github.com/dexafree/MaterialList

 

17. android-floating-action-button 머티리얼 디자인 가이드의 화면에 떠 있는 원형의 액션 버튼으로 리스트뷰와 리사이클러뷰의 스크롤에 따른 액션 지원액션
https://github.com/futuresimple/android-floating-action-button

 

18. Android-Material-circular-button 원형의 버튼으로 컬러값의 변경시 애니메이션 지원
https://github.com/glomadrian/Android-Material-circular-button

 

19. material-drawer DrawerLayout의 컨텐츠 뷰를 머티리얼 디자인 가이드에 맞게 쉽게 사용가능.
https://github.com/HeinrichReimer/material-drawer

 

20. snackbar 머티리얼 디자인 가이드에서 소개한 스낵바를 사용 할 수 있도록 지원. 토스트와 비슷하며 지속적으로 메시지를 노출 하거나 사용자의 액션을 받을 수 있음.
https://github.com/nispok/snackbar

 

21. material-range-bar 범위를 선택 할 수 있는 SeekBar
https://github.com/oli107/material-range-bar