이야기앱 세상
Android 6.0 (API level 23)이상에서 권한 설정하기 본문
Android 6.0 (API level 23)에서는 androidmanifest.xml에 권한 설정하는 것 외에 앱 실행시 권한에 대한 설정을 사용자가 사용할지 거부할지를 지정해야 한다. 즉, 권한 설정을 프로그램적으로 처리해야 사용자가 허용 또는 거부할 수 있기 때문에 프로그램적으로 처리하지 않으면 androidmanifest.xml에 권한 설정을 했다고 해도 구동이 안 되는 현상이 일어난다.
모든 권한에 대해서 프로그램적으로 처리해야 하는 것은 아니고 달력, 카메라, 연락처, 위치정보, 마이크, 전화, 센서, 문자, 저장소 등을 사용할 때는 처리해야 한다.
앱을 실행하고 권한을 필요로 하는 코드가 구동되기 전에 아래와 같은 코드를 이용해서 사용자가 권한을 허용할지 거부할지를 결정할 수 있는 창이 뜨게 처리한다.
<센서 권한을 허용 여부를 묻는 창의 예>
sdcard 읽기와 쓰기 권한 설정을 예로 들어 보겠다.
private static final int MY_PERMISSIONS_REQUEST_READ_CONTACTS = 1;
private static String[] PERMISSIONS_STORAGE = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
// 권한을 획득하기전에 현재 Acivity에서 지정된 권한을 사용할 수 있는지 여부 체크
if (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
// 권한 획득에 대한 설명 보여주기
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
// 사용자에게 권한 획득에 대한 설명을 보여준 후 권한 요청을 수행
} else {
// 권한 획득의 필요성을 설명할 필요가 없을 때는 아래 코드를
//수행해서 권한 획득 여부를 요청한다.
ActivityCompat.requestPermissions(thisActivity,
PERMISSIONS_STORAGE,
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
}
}
------------------------------
위의 코드가 실행되서 사용자가 권한 획득을 허용하거나 거부하면 아래 메서드가
호출됨
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
//권한 획득이 거부되면 결과 배열은 비어있게 됨
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//권한 획득이 허용되면 수행해야 할 작업이 표시됨
//일반적으로 작업을 처리할 메서드를 호출
} else {
//권한 획득이 거부되면 수행해야 할 적업이 표시됨
//일반적으로 작업을 처리할 메서드를 호출
}
return;
}
}
}