안드로이드 개발 전화번호 조회 퍼미션 에러 해결하는 방법

 

환경: Android Studio

 

전화번호를 조회하기 위해서는 사용자의 허락을 필요로 합니다. 예전과 달리 AndroidManifest.xml 에 퍼미션을 추가한다고 해서 해결되지는 않습니다. 연락처 조회를 위해 getContentResolver().query() 를 호출했는데 다음과 같은 에러가 난다면 Activity 에서 onRequestPermissionsResult() 를 상속 받아 구현해야 합니다.

 

Permission Denial: opening provider requires android.permission.READ_CONTACTS or android.permission.WRITE_CONTACTS

안드로이드 개발 전화번호 조회 퍼미션 에러 해결하는 방법

 

▼ 먼저 AndroidManifest.xml 에 사용자 정보를 읽고 쓸 수 있는 퍼미션을 추가해야 합니다. 만약 추가하지 않으면 사용자에게 허가를 요구하는 팝업창이 나타나지 않습니다

안드로이드 개발 전화번호 조회 퍼미션 에러 해결하는 방법

 

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

// Request code for READ_CONTACTS. It can be any number > 0.
private static final int PERMISSIONS_REQUEST_READ_CONTACTS = 100;
private static final int PERMISSIONS_REQUEST_WRITE_CONTACTS = 101;

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_CONTACTS)
            != PackageManager.PERMISSION_GRANTED) {

        requestPermissions(
                new String[]{Manifest.permission.READ_CONTACTS},
                PERMISSIONS_REQUEST_READ_CONTACTS);
        //After this point you wait for callback in onRequestPermissionsResult(int, String[], int[]) overriden method
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
            && checkSelfPermission(Manifest.permission.WRITE_CONTACTS)
            != PackageManager.PERMISSION_GRANTED){

        requestPermissions(
                new String[]{Manifest.permission.WRITE_CONTACTS},
                PERMISSIONS_REQUEST_WRITE_CONTACTS);
    } else {
        // 해당 로직으로 이동
        setPhoneList();
    }
}


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

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,
                                       int[] grantResults) {
    if (requestCode == PERMISSIONS_REQUEST_READ_CONTACTS) {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // Permission is granted
            setPhoneList();
        } else {
            Toast.makeText(this, "Until you grant the permission, we canot display the names", Toast.LENGTH_SHORT).show();
        }
    }
}


▼ requestPermissions() 함수를 호출하면 사용자 화면에 연락처에 대한 엑세스 권한을 줄 것인지 묻습니다. 런타임에 다른 주요 권한을 요청하려면 위와 같은 방법을 사용해야 합니다

안드로이드 개발 전화번호 조회 퍼미션 에러 해결하는 방법

Posted by 녹두장군