개발린생

[안드로이드/Kotlin] 일반 권한과 위험 권한 / 앱 권한 요청하기 본문

Dev Lab ✧.·˚/Android & iOS

[안드로이드/Kotlin] 일반 권한과 위험 권한 / 앱 권한 요청하기

김블루 2023. 1. 17. 22:20

* 이 포스트에 작성된 코드는 Kotlin 언어로 작성하였습니다.

 

안드로이드 앱에 기능을 구현할 때, 데이터나 기능의 사용을 위해 설정 파일에 권한을 명세합니다.

이 권한 중에는 일반 권한과 위험 권한이 있으며 보호 수준에 따라 권한을 명세하고 요청하는 방법을 알아보겠습니다.


일반 권한

일반 권한은 사용자에게 권한 승인 여부를 묻지 않습니다.

흔한 예시로는 네트워크 통신을 기반의 앱이라면 필수로 명세하는 INTERNET 권한이 있습니다.

앱에서 네트워크 및 인터넷 사용을 위해 명세하는 권한이며 적용 위치와 코드는 아래와 같습니다.

 

AndroidManifest.xml

명세 위치

<manifest ...>

    <!--해당 권한 추가-->

    <application ...>
        ...
    </application>
</manifest>

권한 명세

<!--일반 권한 : 네트워크 및 인터넷 사용 권한-->
<uses-permission android:name="android.permission.INTERNET" />

위험 권한 (런타임 권한)

위험 권한은 사용자에게 권한 승인 요청 후 권한이 주어집니다.

앱에서 카메라를 사용하거나, 위치 정보 사용, 저장소 읽기 등 앱이 사용자의 개인정보와 관련된 데이터나 기능을 사용하거나 다른 앱과 기기 작동에 영향을 줄 수 있는 권한입니다.

 

위험 권한 처리를 위한 단계와 사용 메서드는 아래와 같습니다.

위험 권한 처리 단계

  1. 권한에 대한 사용자 승인 확인 (이미 승인이 되어있는지)
  2. 사용자 승인 요청
  3. 사용자 승인 후 처리

권한 요청 시 사용하는 메서드

  • 권한 승인 여부 확인 - ContextCompat.checkSelfPermission(Context, String)
  • 권한 승인 요청 - Activity.requestPermissions(String[], int)
  • 권한 승인 요청 결과 확인 - ActivityCompat.onRequestPermissionsResult(int, String[], int[])

AndroidManifest.xml

명세 위치

<manifest ...>

    <!--해당 권한 추가-->

    <application ...>
        ...
    </application>
</manifest>

권한 명세

<!--위험 권한 : 카메라 권한-->
<uses-permission android:name="android.permission.CAMERA" />

권한 명세 위치와 명세까지는 동일하나

위 처리 단계와 메서드를 적용한 권한 승인 요청 코드를 작성해야합니다.

 

메서드 생성

아래와 같은 메서드를 생성한 후 원하는 위치에서 호출해줍니다.

/**
 * 권한 승인 여부 확인
 * @return 승인 여부
 */
private fun isCheckedPermission(): Boolean {
    return ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED
}
/**
 * 권한 승인 요청
 */
private fun requestPermission() {
    requestPermissions(arrayOf(Manifest.permission.CAMERA), 99)
}
/**
 * 권한 승인 요청 결과 확인
 */
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    if (requestCode == 99) {
        var checkResult = true

        // 모든 퍼미션을 허용했는지 체크
        for (result in grantResults) {
            if (result != PackageManager.PERMISSION_GRANTED) {
                checkResult = false
                break
            }
        }

        // 권한 승인 여부 출력
        binding.tvPermissionState.text =
            if (checkResult) {
                "권한 있음"
            } else {
                Toast.makeText(this, "모든 권한을 허용해주세요.", Toast.LENGTH_SHORT).show()
                "권한 없음"
            }
    }
}

 

저는 앱 화면이 보여질 때마다 권한 승인 여부 확인을 하고 해당 여부를 볼 수 있게 TextView에 출력해두었습니다.

권한 요청 버튼 클릭 시, 해당 권한 승인을 요청하는 방식으로 처리하고 갱신되는 승인 여부를 TextView에 출력하게 구현해두었습니다.

아래 Github 예제 코드 참고하시면 좋을 듯 합니다.

 

https://github.com/YuHyeon-Kim/PermissionCheck.git

 

GitHub - YuHyeon-Kim/PermissionCheck: Android Kotlin - 일반 권한과 위험 권한 명세하고 요청하는 예제

Android Kotlin - 일반 권한과 위험 권한 명세하고 요청하는 예제. Contribute to YuHyeon-Kim/PermissionCheck development by creating an account on GitHub.

github.com


참고 공식 문서

https://developer.android.com/training/permissions/requesting

 

앱 권한 요청  |  Android 개발자  |  Android Developers

앱 권한 요청 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 모든 Android 앱은 액세스가 제한된 샌드박스에서 실행됩니다. 앱이 자체 샌드박스 밖에 있는 리

developer.android.com

https://developer.android.com/reference/android/Manifest.permission

 

Manifest.permission  |  Android Developers

 

developer.android.com