티스토리 뷰

android

19. permission 개념

구름나드리 2018. 8. 16. 09:53



안드로이드 퍼미션



안드로이드 6.0 Marshmallow(API 23) 이전에는 andoridmainfest.xml 에 필요한 위험 권한을 선언해놓고, 앱을 설치할 때 한 번에 

권한을 획득하는 방식이 였습니다. 

즉 AndroidManifest.xml 에서 선언한 모든 권한에 대해서 허가를 받아올 필요는 없습니다.

구글이 정의한 Nomal Permission 과 Dangerous Permission 중 Dangerous Permission에 대해서만 권한을 체크 해주면 됩니다.



꼭 Permission을 체크하고 허가를 받아야 하는 퍼미션과 퍼미션 그룹입니다.

그리고 그룹에 속하는 한 가지 항목에 대해 권한을 승인 받으면, 같은 그룹에 속한 다른 권한은 시스템이 자동으로 

권한을 부여 합니다. 

Permission Group

Permissions
CALENDAR
CAMERA
CONTACTS
LOCATION
MICROPHONE
PHONE
SENSORS
SMS
STORAGE


마시멜로우버전 이상에서 권한 처리 


이제는 설치할때 권한허용 여부를 묻지 않습니다. 앱에서 해당 권한이 필요할때마다 사용자로부터 권한을 

허가받도록 변경 되었습니다.


먼저 사용방법을 확인하기 전에 주의 사항부터 확인 해 봅시다.



1. AndroidManifest에 명시하지 않은 권한을 ActivityCompat.reqeustPermissions()로 요청하는 경우 다이얼로그가 뜨지 

안습니다. 



2.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&

(ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) {


누군가가 이거 6.0 이하에서는 그냥 0(PERMISSION_GRANTED)을 반환한다고 써놨던데, 아님

항상 -1(PERMISSION_DENIED)를 반환하니까 버전 체크해서 6.0 이상만 수행하도록 해야한다.



3.

ActivityCompat.shouldShowRequestPermissionRationale()


위 함수는 사용자에게 권한에 대한 설명이 필요한 경우인지를 체크하는 함수로, 권한 요청 다이얼로그에서 한 번 이상 거부하고, 다시 보지 않기를 체크하지 않은 경우에만 true를 반환한다.

Note ) 다시 보지 않기를 체크하고 거부하였을 경우에는 ActivityCompat.requestPermissions()를 요청해도 자동으로 사용자가 거절을 누른 것으로 처리하기 때문에 권한 요청 다이얼로그를 띄우지 않고 바로 onRequestPermissionsResult()로 넘어간다.




사용방법 


권한을 가지고 있는지 확인 하기 


int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_CALENDAR);
if(permissionCheck== PackageManager.PERMISSION_DENIED){

// 권한 없음
}else{
// 권한 있음
}


해당 권힌이 필요한 이유를 설멸해야하는 경우인지 확인하기

shouldShowRequestPermissionRationale()


FragmentCompat와 ActivityCompat 클래스에서 이 함수를 사용해서 체크할 수 있습니다.

해당 함수가 true를 리턴하는경우 우리는 왜 해당 권한이 필요한지를 설명해주고나서 권한 허가를 요청해야 합니다.

만약 권한허가요청 다이어로그에서 사용자가 [다시 묻지 않기]를 체크했다면 이 함수는 항상 false를 리턴합니다.

처음 권한을 요청하는경우에 이 함수는 항상 false를 요청합니다.

즉 사용자가 [다시 묻지 않기]를 체크하지 않고, 1번이상 권한요청에 대해 거부한 경우에만 true를 리턴해주고 있습니다.

왜 처음 권한을 요청할때 true를 리턴하지 않는지 이해가 가지 않습니다.

아래에서 설명하겠지만 저는 이 함수를 활용하지 않습니다.


권한 허가 요청하기

requestPermissions()

FragmentCompat와 ActivityCompat 클래스에서 이 함수를 사용해서 사용자에게 권한허가를 요청하는 다이어로그를 띄울수 있습니다.


// Activity에서 실행하는경우
if (ContextCompat.checkSelfPermission(this,Manifest.permission.READ_CONTACTS)!= PackageManager.PERMISSION_GRANTED) {

// 이 권한을 필요한 이유를 설명해야하는가?
if (ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.READ_CONTACTS)) {

// 다이어로그같은것을 띄워서 사용자에게 해당 권한이 필요한 이유에 대해 설명합니다

// 해당 설명이 끝난뒤 requestPermissions()함수를 호출하여 권한허가를 요청해야 합니다

} else {

ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);

// 필요한 권한과 요청 코드를 넣어서 권한허가요청에 대한 결과를 받아야 합니다

}
}



권한허가 요청후 결과 가져오기

onRequestPermissionsResult()

이 함수는 Activity의 onActivityResult()와 비슷한 개념입니다.

위의 예제에서 MY_PERMISSIONS_REQUEST_READ_CONTACTS로 보낸 요청코드에 대해서 결과값을 가져오고 그에대한 처리를 해주어야 합니다.



@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_READ_CONTACTS: 

if (grantResults.length 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
         // 권한 허가
// 해당 권한을 사용해서 작업을 진행할 수 있습니다
         else {
         // 권한 거부
// 사용자가 해당권한을 거부했을때 해주어야 할 동작을 수행합니다
}
return;
}
}



권한 부여는 귀찮은 작업이 맞다 

그래서 퍼옴 .... 


https://github.com/ParkSangGwon/TedPermission



출처: http://gun0912.tistory.com/61 [박상권의 삽질블로그]




'android' 카테고리의 다른 글

21 RelativeLayout  (0) 2018.08.16
20. permission 활용(소스)  (0) 2018.08.16
18. CoordinatorLayoutAndFabAndSnacBar  (0) 2018.08.13
17. CoordinatorLayout 01  (0) 2018.08.13
16. TabLayout(ViewPager 사용) 구현  (0) 2018.08.11
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
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 28
29 30 31
글 보관함