-
[Android Kotlin] Permission(권한) 얻기개발 끄적끄적/Android 2020. 6. 2. 15:15반응형
개발을 하다 보면 사용자(기기)의 위치 정보, 인터넷 권한, 혹은 내장 메모리에 접근해야하는 등의 작업이 필요할 때가 있습니다. 이때 필요한 permission(권한)의 종류와 방법에 대해 알아보겠습니다.
권한을 요청할 경우 사용자에게 이유를 설명하는 것이 좋습니다. 사용자가 사진앱을 실행할 때 사용자에게 카메라 권한을 요청해도 놀라지 않을 것이지만, 사용자 위치나 내장메모리 등의 권한을 요청한다면 사용자가 의아하겠죠. 따라서 권한을 요청하기 전 사용자에게 권한에 대한 간결한 설명을 고려해야 합니다. 설명이 복잡하고 길어진다면 앱을 제거할 확률이 생기겠죠?
권한을 요청했는데 사용자가 권한 요청을 거절했을 경우 사용할 수 있는 메소드가 있습니다. shouldShowRequestPermissionRationable() 인데요. 이 메소드는 사용자가 해당 권한 요청을 거부했을 때 true를 반환합니다.
모든 권한이 사용자의 허가를 받아야 하는 것은 아닙니다. 시스템 권한은 여러 보호 레벨로 나뉘어져 있습니다. 알아야 하는 가장 중요한 두 가지 보호 레벨은 정상 권한과 위험한 권한입니다.
위험한 권한에는 앱이 사용자의 개인 정보를 포함하거나 다른 앱의 작업에 영향을 미칠 수 있는 데이터나 리소스를 필요로 하는 영역이 포함됩니다. 예를 들어 연락처, 카메라, 위치 정보 등이 있습니다.
갤러리에 접근하는 권한을 요청해보겠습니다.
manifest에 권한 추가
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.mp12"> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <application ... </application> </manifest>
내장 메모리에 접근하는 권한은 위험 권한으로 간주되어 사용자가 권한을 허용해야 합니다.
또한 처음 권한을 요청하는것 외에도 사용자가 언제든 어플리케이션 설정에서 권한을 취소할 수 있으므로 권한이 있는지 확인하는 작업이 필요합니다.
val PERMISSIONS_REQUEST_CODE = 100 var REQUIRED_PERMISSIONS = arrayOf<String>( Manifest.permission.READ_EXTERNAL_STORAGE) private fun requestPermission(){ var permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) if(permissionCheck != PackageManager.PERMISSION_GRANTED){ //설명이 필요한지 if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_EXTERNAL_STORAGE)){ //설명 필요 (사용자가 요청을 거부한 적이 있음) ActivityCompat.requestPermissions(this, REQUIRED_PERMISSIONS, PERMISSIONS_REQUEST_CODE ) }else{ //설명 필요하지 않음 ActivityCompat.requestPermissions(this, REQUIRED_PERMISSIONS, PERMISSIONS_REQUEST_CODE ) } }else{ //권한 허용 } }
- ContextCompat.checkSelfPermission() 메소드를 이용해 해당 권한이 PERMISSION_GRANTED 인지 확인
- shouldShowRequestPermissionRationale() 메소드로 해당 권한을 사용자가 거부한 적이 있는지 확인
- shouldShowRequestPermissionRationale() 메소드의 리턴값에 따라 분기점을 나눠 처리 가능
- ActivityCompat.requestPermissions() 메소드로 권한 요청
위와 같은 순서로 이루어집니다. 사용자가 앱 권한 요청에 응답하면 시스템은 onReqeustPermissionResult() 메소드를 호출합니다. 권한이 부여되었는지를 확인하려면 해당 메소드를 오버라이딩해 재정의 해주어야 합니다. 이 콜백 메소드에는 정의해둔 PERMISSIONS_REQUEST_CODE 가 전달됩니다.
override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<out String>, grantResults: IntArray ) { when(requestCode){ PERMISSIONS_REQUEST_CODE -> { if(grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED){ //권한 허용 }else{ //권한 거부됨 } return } } }
- 전달한 PERMISSIONS_REQUEST_CODE 값과 requestCode가 같은지 확인
- grantResults의 사이즈 확인 & 첫번째 인덱스 PackageManager.PERMISSION_GRANTED 확인
위와 같이 onRequestPermissionsResult() 에는 전달한 PERMISSIONS_REQUEST_CODE 가 requestCode로 전달됩니다.
권한 종류는 아래에서 확인할 수 있습니다.
반응형'개발 끄적끄적 > Android' 카테고리의 다른 글
[Android Kotlin] 카카오맵 사용하는 방법 (해시키 등록) + 내 위치 표시하기 (0) 2020.06.03 [Android Kotlin] 갤러리에서 이미지 가져와 RecyclerView에 적용하기 (0) 2020.06.03 [Android Kotlin] RecyclerView Adapter View Type (리사이클러뷰 여러 뷰타입) (0) 2020.06.01 [Android Kotlin] Navigation Drawer를 이용한 사이드 메뉴 만들기 (0) 2020.06.01 [Android Studio] 초보 개발자 로그캣(LogCat) 확인 방법 - 에러 찾는 방법 (0) 2020.05.30