Android Coding

실시간 permission 처리 #2

오마로 2017. 3. 17. 08:26
반응형


구글 피쳐 되기 위해 요청한 앱 피드백 결과 중 퍼미션에 대한 내용



3. 안드로이드 6.0(마시멜로)이 출시되면서 사용자가 직접 런타임 앱 권한을 관리할 수 있게 되었습니다. 따라서 사용자가 앱 실행 중 일부 혹은 전체 권한을 거부했을 때, 이를 적절하게 처리하는 것이 중요합니다. 권한 요청 과정은 아래의 가이드라인을 준수해야 합니다.

• 앱의 주요 기능상 필요해서 앱 실행 시점에 특정 권한을 요청해야 하는 경우, 사용자가 이를 허용할 수 있도록 권한이 요청되는 이유를 상황에 맞게 설명하십시오.

• 관련 작업이 수행되는 시점에 요청하시기를 권장해 드립니다.

• 사용자가 권한 요청을 '거부'하는 경우 사용자를 단말기 설정 메뉴로 유도하지 마십시오. 사용자에게 앱 실행을 위해 해당 권한이 필요한 이유를 설명한 뒤 앱 내에서 다시 권한을 요청 하십시오. 사용자가 '항상 거부' 옵션을 선택하지 않는 이상 사용자를 앱 설정으로 이동시키지 마십시오.

귀하의 앱에서 사용자가 ‘다시보지 않기'를 체크하고 앱을 실행할 경우 앱이 실행되지 않습니다. 앱을 실행하기 위해 반드시 필요한 권한이므로 설정 경로를 팝업창으로 안내해주시던가 앱 설정 화면으로 이동시켜 주십시오.

참고로 런타임 앱 권한 요청 과정은 아래와 같습니다.   

앱 실행 초기에 권한 요청 시 사용자가 ‘거부’하는 경우:

1. 해당 권한이 앱의 주요 기능을 사용하는데 필요한 적합한 이유를 설명 > 2. 권한요청 팝업창 > 3. 사용자가 ‘거부'를 선택할 경우 > 4. 다시 해당 권한이 필요한 이유 설명 > 5. 사용자가 ‘거부' 시 위의 처리과정 반복

앱 실행 초기에 권한 요청 시 사용자가 ‘항상거부'를 선택하는 경우:

1. 해당 권한이 앱의 주요 기능을 사용하는데 필요한 적합한 이유를 설명 > 2. 권한요청 팝업창 > 3. 사용자가 ‘거부'를 선택할 경우 > 4. 다시 해당 권한이 필요한 이유 설명 > 5. 사용자가 ‘다시보지 않기' 를 체크하고 ‘거부'를 선택할 경우 > 6. 해당 권한 실행 시 단말기 설정 메뉴로 유도


일단 거부를 했을 경우, 설정 경로를 팝업창으로 안내해주시던가 앱 설정 화면으로 이동하는 로직이 필요함.

그래서, 기존에 설명팝업창에 설정버튼을 만들어서 클릭시, 해당 앱의 설정화면으로 가도록 하면 됨.

 


1.권한 팝업창 처리

기존, 실시간  Permission 처리에서 goReadPhoneStatePermission() 부분 -> 기존글 http://gomsfactory.tistory.com/2

private void goReadPhoneStatePermission(){
if (mPermissionReadPhoneState != PackageManager.PERMISSION_GRANTED) {
// 이 권한을 필요한 이유를 설명해야하는가?
if (ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.READ_PHONE_STATE)) {

// 다이어로그같은것을 띄워서 사용자에게 해당 권한이 필요한 이유에 대해 설명합니다
// 해당 설명이 끝난뒤 requestPermissions()함수를 호출하여 권한허가를 요청해야 합니다
GomsLog.d(TAG, "폰 권한 설명해라");
new AlertDialog.Builder(mPermissionActivity)
.setTitle("Allow Storecamera the following permissions?")
.setMessage("READ PHONE STATE \n\nThis lets you use your phone state inside of Storecamera")
.setCancelable(false)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
onBasicDialogRightOK(AppConstant.ACTIVITY_REQUEST_CODE_PERMISSION_READ_PHONE_STATE);
}
})
.create().show();
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE},
AppConstant.ACTIVITY_REQUEST_CODE_PERMISSION_READ_PHONE_STATE);
// 필요한 권한과 요청 코드를 넣어서 권한허가요청에 대한 결과를 받아야 합니다
}
}else{
GomsLog.d(TAG, "폰 권한 승인상태");
mPermissionReadPhoneState = PackageManager.PERMISSION_GRANTED;
goCameraPermission();
}
}


변경된 goReadPhoneStatePermission() 부분

private void goReadPhoneStatePermission(){
if (mPermissionReadPhoneState != PackageManager.PERMISSION_GRANTED) {
// 이 권한을 필요한 이유를 설명해야하는가?
if (ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.READ_PHONE_STATE)) {

// 다이어로그같은것을 띄워서 사용자에게 해당 권한이 필요한 이유에 대해 설명합니다
// 해당 설명이 끝난뒤 requestPermissions()함수를 호출하여 권한허가를 요청해야 합니다
GomsLog.d(TAG, "폰 권한 설명해라");

String alert = goAlertTitle();

new AlertDialog.Builder(mPermissionActivity)
.setTitle(getString(R.string.permission_title)) //"Allow Storecamera the following permissions?"
.setMessage(Html.fromHtml(alert)) //"READ PHONE STATE \n\nThis lets you use your phone state inside of Storecamera"
.setCancelable(false)
.setNegativeButton(R.string.dialog_close, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
onBasicDialogRightOK(AppConstant.ACTIVITY_REQUEST_CODE_PERMISSION_READ_PHONE_STATE);
}
})
.setPositiveButton(R.string.pc_setting_title, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
try {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
.setData(Uri.parse("package:" + BuildConfig.APPLICATION_ID));
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
startActivityForResult(intent, AppConstant.ACTIVITY_REQUEST_CODE_PERMISSION_SETTING);
} catch (ActivityNotFoundException e) {
e.printStackTrace();
Intent intent = new Intent(Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS);
startActivityForResult(intent, AppConstant.ACTIVITY_REQUEST_CODE_PERMISSION_SETTING);
}
}
}).create().show();
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE},
AppConstant.ACTIVITY_REQUEST_CODE_PERMISSION_READ_PHONE_STATE);
// 필요한 권한과 요청 코드를 넣어서 권한허가요청에 대한 결과를 받아야 합니다
}
}else{
GomsLog.d(TAG, "폰 권한 승인상태");
mPermissionReadPhoneState = PackageManager.PERMISSION_GRANTED;
goCameraPermission();
}
}


2. 3가지 권한이 필요한 부분이라서, 팝업창 내용을 3가지 권한에 대한 내용으로 변경하여 보여줌


private String goAlertTitle(){

StringBuffer sb = new StringBuffer();
if(mPermissionReadPhoneState != PackageManager.PERMISSION_GRANTED){
sb.append(getString(R.string.permission_read_phone_state));
sb.append("<br><br>");
}
if(mPermissionCamera != PackageManager.PERMISSION_GRANTED){
sb.append(getString(R.string.permission_camera_only));
sb.append("<br><br>");
}
if(mPermissionReadExternalStorage != PackageManager.PERMISSION_GRANTED){
sb.append(getString(R.string.permission_storage));
sb.append("<br><br>");
}
return sb.toString();
}




3.앱의 권한 설정으로 이동, 각 권한 변경 후 Back 했을 경우 처리

  Result 값을 받아, 다시 goLoading() 하여 권한 여부 확인하고 처리


@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case AppConstant.ACTIVITY_REQUEST_CODE_PERMISSION_SETTING:
goLoading();
break;
}
}


구글 피쳐가 되기 위한 길은 멀고도 험하지만, 피쳐되면 구글플레이 첫 화면 > 추천에 들어갈 수 있는 희망이 있고

각 나라별 구글플레이에도 들어갈 수 있는 희망이 있다 ^^


이렇게 수정해서 다시 앱 업데이트...


반응형