안드로이드 개발 전화번호 조회 퍼미션 에러 해결하는 방법
|
전화번호를 조회하기
위해서는 사용자의 허락을 필요로 합니다. 예전과 달리 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()
함수를 호출하면 사용자 화면에 연락처에 대한 엑세스 권한을 줄 것인지 묻습니다. 런타임에 다른 주요 권한을 요청하려면 위와 같은 방법을 사용해야 합니다.