안드로이드 권한처리
1. 권한의 필요성
- 안드로이드 어플리케이션을 개발하다보면 핸드폰 카메라를 사용하거나 사용자의 폴더에 접 근해야하는 일이 종종 생기곤 하는데, 그런상황마다 사용자로하여금 접근권한 허락을 맡아야 한다. 앱에서 정말 자주 사용되기 때문에 정리해보고자 블로그를 작성하게 되었다.
2. 권한의 종류
- 일반권한 : 사용자에게 큰 위험이 없는 권한으로, 설치 시 자동으로 부여된다.
- ex.ACCESS, Bluetooth, INTERNET 권한 등
- 위험 권한 : 사용자 데이터나 기기에 영향을 미칠 수 있는 권한으로, 실행 시 사용자의 허가를 받아야한다.
- ex. CAMERA, LOCATION,PHONE, STORAGE 권한 등
3. 권한 요청 프로세스
- Manifest 권한선언 : 권한을 사용하기 위해선 Manifest 파일에 해당 권한을 선언해야한다. ex. CAMERA라면
<uses-permission android:name="android.permission.CAMERA" />
- 권한 요청 코드 작성 :실행 시 위험 권한을 요청하려면 ActivityCompat.requestPermissions 메서드를 사용한다.
val PERMISSION_REQUEST_CODE = 1
fun checkAndRequestPermissions() {
val permissions = arrayOf(Manifest.permission.CAMERA, Manifest.permission.ACCESS_FINE_LOCATION)
val permissionsToRequest = permissions.filter {
ContextCompat.checkSelfPermission(this, it) != PackageManager.PERMISSION_GRANTED
}
if (permissionsToRequest.isNotEmpty()) {
ActivityCompat.requestPermissions(this, permissionsToRequest.toTypedArray(), PERMISSION_REQUEST_CODE)
}
}
3. 권한 요청 결과 처리
- 사용자가 권한 요청에 응답하면 'onRequestPermissionResult'메서드가 호출된다.
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == PERMISSION_REQUEST_CODE) {
val deniedPermissions = mutableListOf<String>()
for ((index, result) in grantResults.withIndex()) {
if (result != PackageManager.PERMISSION_GRANTED) {
deniedPermissions.add(permissions[index])
}
}
if (deniedPermissions.isNotEmpty()) {
// 권한이 거부됨, 권한 다시요청
} else {
// 모든 권한허용
}
}
}
4. 예제
- 카메라 권한을 요청하기 위해선 아래의 예시와 같이 수행하면 된다.
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CAMERA), PERMISSION_REQUEST_CODE)
} else {
// 카메라 기능 수행
}
5. Tip
- 사용자에게 권한의 필요성 대한 설명 및 권한요청 시점:
보통 사용자로하여금 필수로 얻어야하는 권한이라면 충분한 설명과 함께 권한을 요청을 하는 것이 중요하다. 현재 필자가 개발하고 있는 앱은 휴대폰번호를 가져오는 권한을 요청하는 작업을 진행하고 있는데 왜 휴대폰 번호 권한이 필요한지 명시적으로 설명글을 적어놓았고, 해당 권한도 딱 필요한 시점에만 권한을 묻게 설정을 하였다. 이런 권한관련 설정은 사용자로 하여금 불편을 덜게 하기 위해 요청 시점도 중요하다.
- 필수권한이라면 사용자가 사용권한을 거절하였을때 ,앱을 아예 실행시키지 못하게 하는것 보다는 사용자로하여금 앱설정으로 이동해서 직접 권한을 설정할 수있도록 하는 것이 방법이 될 수있다. 여느 앱들에서도 필수권한이라면 이러한 방식으로 수행하고 있으며, 효율적이라고 생각이 드는 방법이다.