마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

sdk 버전에 따른 퍼미션 설정 문제

0 추천

 

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_NUMBERS) ==
 PackageManager.PERMISSION_GRANTED)
{
    checkSimCardInfo();

} else {


    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_NUMBERS},
 PERMISSION_REQUEST_CODE);
}

위 퍼미션 설정으로 하면 안드로이드 11이상에서 아래와 같이 정상적으로 전화번호가 추출이되고

위 코드중 READ_PHONE_STATE로 변경해서 돌리면 안드로이드10이하 버전에서도 전화번호가 추출이됩니다.

 

문제는 안드로이드 10이하와 11이상에서 작동이 되게 하려고 하는데요

구글링 조언을 받아서 여러가지 형태로 해봤는데.. 잘 안되서 문의드립니다. ㅠㅠ

위 코드를

안드로이드 10이하에서는 READ_PHONE_STATE

안드로이드 11이상에서는 READ_PHONE_NUMBER  퍼미션이 작동되게 하려면 

위소스를 어떻게 수정 해야 하는지 도움요청합니다 ㅠㅠ

 

맘여리노앙자 (500 포인트) 님이 2024년 4월 20일 질문

1개의 답변

0 추천
 
채택된 답변

버전에 따라 퍼미션을 체크하는 로직을 추거하세요.

버전체크하는 로직을 추가합니다.

fun isAndroid10OrBelow(): Boolean = Build.VERSION.SDK_INT <= Build.VERSION_CODES.Q

fun isAndroid11OrAbove(): Boolean = Build.VERSION.SDK_INT >= Build.VERSION_CODES.R


버전에 맞는 퍼미션 체크로직을 추가합니다.

fun isPermissionGranted(context: Context, permission): Boolean {
    return ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED
}


fun isReadPhoneStatusPermissionRequired(version: String): Boolean{
   return isAndroid10OrBelow() && !isPermissionGranted(Manifest.permission.READ_PHONE_STATUS)
}


fun isReadPhoneNumberPermissionRequired(g: Boolean {
      return isAndroid11OrAbove() && !isPermissionGranted(Manifest.permission.READ_PHONE_NUMBERS)
}


이제 어느 버전에서 어느 퍼미션을 요청할지 결정할 수 있기 때문에 퍼미션이 이미 있으면 진행을 하고 필요하면 요청을 한 후 진행을 합니다.

fun procceedOrRequestPermssions() {
     var requiredPermissions = arrayOf<String>()
     if (isReadPhoneStatusPermissionRequired()) {
            requiredPermissions = requiredPermissions.plus(Manifest.permission.READ_PHONE_STATUS)
     }

    if (isReadPhoneNumberPermissionRequired()) {
         requiredPermissions = requiredPermissions.plus(Manifest.permission.READ_PHONE_NUMBERS)
    }

    if (requiredPermissions.isEmpty()) {
       return checkSimCardInfo()
    }

    ActivityCompat.requestPermissions(this, permissions)
}


코틀린으로 작성됐으므로 필요하면 ChatGPT를 통해 자바로 변환을 하시고, 테스트는 안된 코드이므로 무조건 가져다 사용하지는 마시길 바랍니다.
 

spark (230,170 포인트) 님이 2024년 4월 21일 답변
맘여리노앙자님이 2024년 4월 21일 채택됨
문서를 보면

READ_PHONE_NUMBERS
Added in API level 26

public static final String READ_PHONE_NUMBERS

Allows read access to the device's phone number(s). This is a subset of the capabilities granted by READ_PHONE_STATE but is exposed to instant applications.

READ_PHONE_STATE는 Android Oreo부터 필요한 것으로 보이고 이 퍼미션이 있으면 READ_PHONE_NUMBERS 자동으로 획득된다고 나와있는데요. 틀리지는 않으셨겠지만, 혹시 모르니확읺해 보시기 바랍니다.
...