안드로이드 개발 SMS 조회 퍼미션 에러 해결하는 방법

안드로이드 개발

안드로이드 개발 SMS 조회 퍼미션 에러 해결하는 방법

 

환경: Android Studio 3.0.0

 

메시지 전송을 위해서는 사용자의 허락을 필요로 합니다. 예전과 달리 AndroidManifest.xml 에 퍼미션을 추가한다고 해서 해결되지는 않습니다. SMS 조회를 위해 쿼리를 실행했는데 다음과 같은 에러가 난다면 Activity 에서 onRequestPermissionsResult() 를 상속 받아 구현해야 합니다.

 

Permission Denial: reading com.android.providers.telephony.SmsProvider uri content://sms from pid=28132, uid=10080 requires android.permission.READ_SMS, or grantUriPermission()

 

AndroidManifest.xml 에 퍼미션 코드를 추가합니다. 만약 추가하지 않으면 사용자에게 허가를 요구하는 팝업창이 나타나지 않습니다

 

다음은 퍼미션 요청을 사용자에게 보여주기 위한 소스를 추가해야 합니다. 함수에서는  checkSelfPermission() 함수를 이용해서 READ_SMS Granted 되었는지 체크합니다. 만약 원하는 퍼미션이 없다면 requestPermissions() 를 호출합니다. 두 번째 파라미터 값인 PERMISSIONS_REQUEST_READ_SMS 는 사용자가 임의로 정합니다

private static final int PERMISSIONS_REQUEST_READ_SMS = 100;

private void callPermission() {
    // Check the SDK version and whether the permission is already granted or not.
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
            && checkSelfPermission(Manifest.permission.READ_SMS)
            != PackageManager.PERMISSION_GRANTED) {

        requestPermissions(
                new String[]{Manifest.permission.READ_SMS},
                PERMISSIONS_REQUEST_READ_SMS);
    } else {
        // 해당 로직으로 이동
        sendSMS();
    }
}

requestPermissions() 요청한 결과는 onRequestPermissionsResult() Callback 함수로 넘어옵니다. 인수로 넘어오는 requestCode = PERMISSIONS_REQUEST_READ_SMS if (grantResults[0] == PackageManager.PERMISSION_GRANTED) 를 체크합니다. 만약 참이라면 SMS 를 보내는 함수를 실행할 수 있겠죠

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,
                                       int[] grantResults) {
    if (requestCode == PERMISSIONS_REQUEST_READ_SMS) {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // Permission is granted
            sendSMS();
        } else {
            Toast.makeText(this, "Until you grant the permission, we canot display the names", Toast.LENGTH_LONG).show();
        }
    }
}
Posted by 녹두장군