본문 바로가기
카테고리 없음

[안드로이드] 마시멜로 런타임 권한 체크!! Requesting Permissions at Run Time

by CreativeDD 2016. 8. 16.
반응형


안드로이드 개발하면서 가장 하기 싫은 것은?



아....

할때마다 익숙해지지 않고

살짝 하기가 싫은 

Runtime Permission 

입니다.


하기가 싫다니, 초심 잃었구만~!!

하실수도 있겠지만 말입니다.


하하하

하지만.. 다시 초 긍정마인드 붙잡고

가보겠습니다.



----------------------------------------------------------



역시 다짜고짜 코드로 먼저 들어가 보겠습니다!!

public static void checkPermission(final Activity activity) {
if (ActivityCompat.checkSelfPermission(activity,
Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(activity,
Manifest.permission.ACCESS_FINE_LOCATION)) {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("permission");
builder.setMessage("permission....");
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
requestPermission(activity);
}
});
builder.create().show();
return;

}
requestPermission(activity);
}
}

이런 정리되지 않은 코드로 죄송스럽네요.(_ _)

저의 레벨로는 액티비티나 프래그먼트에 이런코드가 들어가 있으면,

정신도 산만해지고 해서, PermissionUtils를 만들어서 

여기에 집어넣고 쓰고 있습니다.

심지어 다이얼로그빌더에 네가티브 버튼도 넣지 않고....

이해해 주시길 부탁드려요.


시나리오는 이렇습니다.

if (ActivityCompat.checkSelfPermission(activity,
Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {

먼저 퍼미션(여기서는 위치정보)을 가지고 있냐고 물어봅니다.

만약 그렇지 않다면

다시 If문 안으로 들어 갑니다.

if (ActivityCompat.shouldShowRequestPermissionRationale(activity,
Manifest.permission.ACCESS_FINE_LOCATION)) {

들어가게 되면, 

또 물어봅니다.

이 권한을 요청하는, 이유를 설명해야 하는경우인가라고 물어봅니다.

??

(아... 이거 필요한건가??하는 생각이 듭니다만)

"저 같은 레벨로는 이유를 이해하기 힘들지만,,  개인정보보호를 위해 깊은 뜻으로 하자고 하는부분이겠지요.

어찌됬던 저는 단순히

AlertDialogBuilder로 간단히 permission이라고만 적고 띄우도록 하였습니다.

이때 사용자가 오케이를 누르면 권한을 요청하는 메소드를 호출하도록 하였습니다.


길고 긴 코드터널을 지나서 드디어.. 권한 요청 메소드를 실행!




private static void requestPermission(Activity activity) {

ActivityCompat.requestPermissions(activity,
new String[]{Manifest.permission.READ_CONTACTS,
Manifest.permission.ACCESS_FINE_LOCATION
},
REQUEST_PERMISSION
);
}

아...이제야, 겨우 권한 요청을 하게 되었습니다.

(abstract class인 permissionsUtil에 static 메소드로 넣어놓아서,

혹시,, static이 눈에 밟히시는 분들을 위해 잠시 설명을 붙입니다)


new String[]{ 요 부분에 받아야 할 권한들을 넣어 줍니다. }

그리고, REQUEST_PERMISSION은 int타입의 임의로 정한 리퀘스트 코드를 적어주는 곳입니다.

private static final int REQUEST_PERMISSION = 100;


이렇게 해서 유저는 권한 허가화면을 보게 됩니다.

요즘 나오는 앱들을 보면, 한번에 3개, 4개의 권한을

첫시작화면에 몰아서 물어보는 경우도 왕왕 있더군요.


구글에서는 적합한 때에 권한요청 대화창을 뛰우라고 하고 있는데요,

상황에 적합하게

유저분들이 불편하지 않도록 잘 조절해야할 것 같습니다.

앱시작하고 3,4개 한꺼번에 대화창을 보는 것은

개인적으로는 좋은 경험은 아니였습니다.



----------------------------------------------------------



언젠가 개선되었으면 좋겠지만,

벌써 이런식으로 많이 적용되기 시작했으니

큰 흐름을 바꾸기는 쉽지 않을 것 같네요.


부디 유저분들이 좀더 안전하고 즐거워지기를 바랄뿐입니다. 하하하


728x90