마스터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  퍼미션이 작동되게 하려면 

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

 

맘여리노앙자 (480 포인트) 님이 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 (227,830 포인트) 님이 4월 21일 답변
맘여리노앙자님이 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 자동으로 획득된다고 나와있는데요. 틀리지는 않으셨겠지만, 혹시 모르니확읺해 보시기 바랍니다.
...