Android Coding

실시간 permission 처리

오마로 2017. 3. 9. 20:22
반응형


실시간 권한 설정에 대한 처리


구글 피쳐 등록을 요청함에 있어서, 여러 가지 수정사항을 받았다.

그중에 "최신 OS버전의 기능과 테마들이 정상적으로 앱에 적용되기 위해서는 targetSdkVersion이 최신 버전(현재 25)으로 설정되어야 합니다"



최신버전으로 적용하지 않은 이유는 실시간 권한 설정에 대한 불편함때문이였는데 ^^;;


우선 앱을 최신 버전으로 설정하고, 실시간 권한 설정을 진행



 * WRITE_EXTERNAL_STORAGE

 * READ_EXTERNAL_STORAGE
 * READ_PHONE_STATE
 * CAMERA


폰정보, 카메라, 앨범에 대한 권한 설정 처리


1.onCreate에 해당 Permission 확인 처리

퍼미션이 다 있으면, 로딩화면으로 보내기 위해 ^^

/** Permission 관련 처리 */
mPermissionReadPhoneState = ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.READ_PHONE_STATE);
mPermissionCamera = ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.CAMERA);
mPermissionReadExternalStorage = ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.READ_EXTERNAL_STORAGE);
mPermissionWriteExternalStorage = ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE);

GomsLog.d(TAG, "mPermissionReadPhoneState : " + mPermissionReadPhoneState);
GomsLog.d(TAG, "mPermissionCamera : " + mPermissionCamera);
GomsLog.d(TAG, "mPermissionReadExternalStorage : " + mPermissionReadExternalStorage);
GomsLog.d(TAG, "mPermissionWriteExternalStorage : " + mPermissionWriteExternalStorage);

if(mPermissionReadPhoneState == PackageManager.PERMISSION_GRANTED && mPermissionCamera == PackageManager.PERMISSION_GRANTED &&
mPermissionReadExternalStorage == PackageManager.PERMISSION_GRANTED && mPermissionWriteExternalStorage == PackageManager.PERMISSION_GRANTED ){
Intent intent = new Intent(mPermissionActivity, LoadingActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();
}else if(mPermissionReadPhoneState != PackageManager.PERMISSION_GRANTED ) {
goReadPhoneStatePermission();
}else if(mPermissionCamera != PackageManager.PERMISSION_GRANTED ) {
goCameraOnlyPermission();
}else if(mPermissionReadExternalStorage != PackageManager.PERMISSION_GRANTED ) {
goReadExternalStoragePermission();
}else if(mPermissionWriteExternalStorage != PackageManager.PERMISSION_GRANTED ) {
goWriteExternalStoragePermission();
}


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();
}
}


3.퍼미션 요청 후, 결과를 아래와 같이 수신해서 잘 받았다 라고 처리하면 됩니다.

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case AppConstant.ACTIVITY_REQUEST_CODE_PERMISSION_CAMERA:
for (int i = 0; i < permissions.length; i++) {
String permission = permissions[i];
int grantResult = grantResults[i];
if (permission.equals(Manifest.permission.CAMERA)) {
if (grantResult == PackageManager.PERMISSION_GRANTED) {
mPermissionCamera = PackageManager.PERMISSION_GRANTED;
GomsLog.d(TAG, "camera permission authorized");
} else {
GomsLog.d(TAG, "camera permission denied");
}
}else if(permission.equals(Manifest.permission.READ_EXTERNAL_STORAGE)){
if (grantResult == PackageManager.PERMISSION_GRANTED) {
mPermissionReadExternalStorage = PackageManager.PERMISSION_GRANTED;
GomsLog.d(TAG, "read storage permission authorized");
} else {
GomsLog.d(TAG, "read storage permission denied");
}
}else if(permission.equals(Manifest.permission.WRITE_EXTERNAL_STORAGE)){
if (grantResult == PackageManager.PERMISSION_GRANTED) {
mPermissionWriteExternalStorage = PackageManager.PERMISSION_GRANTED;
GomsLog.d(TAG, "write storage permission authorized");
} else {
GomsLog.d(TAG, "write storage permission denied");
}
}
}
GomsLog.d(TAG, "onRequestPermissionsResult goLoading()");
goLoading();
break;
case AppConstant.ACTIVITY_REQUEST_CODE_PERMISSION_READ_PHONE_STATE:
for (int i = 0; i < permissions.length; i++) {
String permission = permissions[i];
int grantResult = grantResults[i];
if (permission.equals(Manifest.permission.READ_PHONE_STATE)) {
if (grantResult == PackageManager.PERMISSION_GRANTED) {
GomsLog.d(TAG, "phone permission authorized");
mPermissionReadPhoneState = PackageManager.PERMISSION_GRANTED;
} else {
GomsLog.d(TAG, "phone permission denied");
}

if(mPermissionCamera != PackageManager.PERMISSION_GRANTED && mPermissionReadExternalStorage != PackageManager.PERMISSION_GRANTED) {
goCameraPermission();
}else if(mPermissionCamera != PackageManager.PERMISSION_GRANTED && mPermissionReadExternalStorage == PackageManager.PERMISSION_GRANTED){
goCameraOnlyPermission();
}else if(mPermissionCamera == PackageManager.PERMISSION_GRANTED && mPermissionReadExternalStorage != PackageManager.PERMISSION_GRANTED){
goReadExternalStoragePermission();
}
}
}
break;
}
}


이번에 피쳐 등록 신청을 하면서, 미루었던 실시간 권한을 적용해서 마음이 편하다 

다음 앱에 바로 적용을 해야 겠다 ^^ 

반응형