티스토리 뷰
안드로이드 퍼미션
안드로이드 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를 리턴하지 않는지 이해가 가지 않습니다.
아래에서 설명하겠지만 저는 이 함수를 활용하지 않습니다.
권한 허가 요청하기
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);
// 필요한 권한과 요청 코드를 넣어서 권한허가요청에 대한 결과를 받아야 합니다
}
}
권한허가 요청후 결과 가져오기
이 함수는 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 |