Android Permission 에 관하여

EomJinha·2024년 7월 5일
post-thumbnail

안드로이드 권한처리

1. 권한의 필요성

  • 안드로이드 어플리케이션을 개발하다보면 핸드폰 카메라를 사용하거나 사용자의 폴더에 접 근해야하는 일이 종종 생기곤 하는데, 그런상황마다 사용자로하여금 접근권한 허락을 맡아야 한다. 앱에서 정말 자주 사용되기 때문에 정리해보고자 블로그를 작성하게 되었다.

2. 권한의 종류

  • 일반권한 : 사용자에게 큰 위험이 없는 권한으로, 설치 시 자동으로 부여된다.
    • ex.ACCESS, Bluetooth, INTERNET 권한 등
  • 위험 권한 : 사용자 데이터나 기기에 영향을 미칠 수 있는 권한으로, 실행 시 사용자의 허가를 받아야한다.
    • ex. CAMERA, LOCATION,PHONE, STORAGE 권한 등

3. 권한 요청 프로세스

  1. Manifest 권한선언 : 권한을 사용하기 위해선 Manifest 파일에 해당 권한을 선언해야한다. ex. CAMERA라면
<uses-permission android:name="android.permission.CAMERA" />
  1. 권한 요청 코드 작성 :실행 시 위험 권한을 요청하려면 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

  • 사용자에게 권한의 필요성 대한 설명 및 권한요청 시점:
    보통 사용자로하여금 필수로 얻어야하는 권한이라면 충분한 설명과 함께 권한을 요청을 하는 것이 중요하다. 현재 필자가 개발하고 있는 앱은 휴대폰번호를 가져오는 권한을 요청하는 작업을 진행하고 있는데 왜 휴대폰 번호 권한이 필요한지 명시적으로 설명글을 적어놓았고, 해당 권한도 딱 필요한 시점에만 권한을 묻게 설정을 하였다. 이런 권한관련 설정은 사용자로 하여금 불편을 덜게 하기 위해 요청 시점도 중요하다.
  • 필수권한이라면 사용자가 사용권한을 거절하였을때 ,앱을 아예 실행시키지 못하게 하는것 보다는 사용자로하여금 앱설정으로 이동해서 직접 권한을 설정할 수있도록 하는 것이 방법이 될 수있다. 여느 앱들에서도 필수권한이라면 이러한 방식으로 수행하고 있으며, 효율적이라고 생각이 드는 방법이다.
profile
앱개발자(with React Native, Kotlin)

0개의 댓글