본문 바로가기
개발노트/Android

[Kotlin] Android 11 권한 이슈 처리

by 전지적진영시점 2023. 2. 20.
반응형

개발 환경

---------------------------------

OS : Mac

개발 툴 : Android Studio

개발 언어 : Kotlin

targetSdk : 31

minSdk : 23

---------------------------------

 

안녕하세요 

이번 포스팅 주제는 Android에서 permission 요청할 때 Android 버전별로 다르게 적용해야하는 버전 및 처리 방법에 대한 내용입니다.

 

<참고참고>

</참고참고>

 

Android permission 변경 사항중에서 이번 포스팅은 "READ_PHONE_STATE" 권한에 대해 다루겠습니다.

 

READ_PHONE_STATE permission android 10 이하를 타겟팅 할 때 전화번호를 가져오는 API에 액세스 해야하는 경우 사용합니다.

<uses-permission
    android:name="android.permission.READ_PHONE_STATE"
    android:maxSdkVersion="29" />

 

android 11 이상의 버전을 타겟팅 할 경우는 "READ_PHONE_NUMBERS" permission 요청을 합니다.

<uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />

 

하지만 App이 MinSDK 버전이 android 버전 10과 11을 모두 포함하는 경우에는 두개의 permission 모두 받아야 합니다.

 

일단 READ_PHONE_NUMBERS 권한과 READ_PHONE_STATE permission 을 AndroidManifest.xml에 셋팅합니다.

 

<uses-permission
    android:name="android.permission.READ_PHONE_STATE"
    android:maxSdkVersion="29" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

 

그리고 사용자에게 권한을 받을 화면 .kt 에다가 permission 변수를 하나 선언해 줍니다.

 

private var permission: String? = null

 

 

현재 버전이 Build.Version_CODES.R (sdk 30) 이상이면 

 

 

READ_PHONE_NUMBERS permission을

 

이하면 READ_PHONE_STATE permission을 셋팅하면 됩니다.

permission = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    Manifest.permission.READ_PHONE_NUMBERS
} else {
    Manifest.permission.READ_PHONE_STATE
}

 

그리고 ActivityCompat.requestPermissions에 셋팅한 permission을 추가합니다.

 

ActivityCompat.requestPermissions(
    this, arrayOf(
        permission,
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.READ_SMS,
    ), Common.REQUEST_CODE
)

 

위 코드로 사용자에게 permission 요청 후 아래 코드로 결과 값 받아 처리하면 됩니다잉

 

override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<String?>,
    grantResults: IntArray
) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    when (requestCode) {
        Common.REQUEST_CODE -> {
            if (grantResults.size == 3 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED && grantResults[2] == PackageManager.PERMISSION_GRANTED) {
                checkCompatibleModel()
            } else {
                Toast.makeText(
                    applicationContext,
                    R.string.access_storage_phone_number,
                    Toast.LENGTH_SHORT
                ).show()
            }
        }
    }
}
반응형

댓글