안드로이드 마시멜로 이상 단말에서는 앱을 사용하기 전, 해당앱에서 사용 하는 기능들에 대한 사용자의 승인을 받아야 한다. 


만약 앱에서 사용하는 기능들이 여러가지 있으나 그중 한가지 이상의 사용자 승인을 받지 않거나 사용자가 승인 거부를 했을 경우 해당 기능을 사용하려 할 경우 오류 발생으로 인한 강제 종료 현상이 발생 할 수도 있다. 물론, 승인 거부를 한 경우 해당 기능을 앱 내부에서 사용하지 못하도록 막을 경우 오류로 인한 강제 종료 현상이 발생 하지 않는다.


그러므로 앱에서 사용 하고자 하는 모든 권한에 대한 정의 및 사용자에게 해당 기능의 사용 승인을 꼭 받아야 한다. 






사용방법


1. AndroidManifest.xml 에 아래와 같은 uses-permission 설정

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.CAMERA" />


2. 퍼미션 요청

private void requestPermissions(){
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.READ_CONTACTS)) {

} else {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_PHONE_STATE}, MY_PERMISSIONS_REQUEST_READ_PHONE_STATE);
}
}

if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.RECEIVE_SMS)) {

} else {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.RECEIVE_SMS}, MY_PERMISSIONS_REQUEST_PROCESS_RECEIVE_SMS);
}
}

if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.CAMERA)) {

} else {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, MY_PERMISSIONS_REQUEST_PROCESS_CAMERA);
}
}

}


3. 요청한 퍼미션의 결과 처리 (onRequestPermissionResult 호출)

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_READ_PHONE_STATE: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
requestPermissions();
} else {
// 이 퍼미션과 관련된 기능 사용하지 못하도록 처리 (그렇지 않을 경우 강제 종료 현상 발생)
}
return;
}
case MY_PERMISSIONS_REQUEST_PROCESS_RECEIVE_SMS: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
requestPermissions();
} else {
// 이 퍼미션과 관련된 기능 사용하지 못하도록 처리 (그렇지 않을 경우 강제 종료 현상 발생)
}
return;
}
case MY_PERMISSIONS_REQUEST_PROCESS_CAMERA: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
requestPermissions();
} else {
// 이 퍼미션과 관련된 기능 사용하지 못하도록 처리 (그렇지 않을 경우 강제 종료 현상 발생)
}
return;
}
}
}



위와 같이 처리 하는 방식도 있지만 그렇지 않고 permission 들을 array 에 담아서 처리 하는 방식도 있다. 


Runtime Permission 관련하여 아래 링크에서 자세히 설명하고 있다.

https://inthecheesefactory.com/blog/things-you-need-to-know-about-android-m-permission-developer-edition/en


블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,