안드로이드 퍼미션 권한 정리.
개별 권한이던 여러개의 권한이던 권한 설정이 안되면 앱 사용이 불가.
권한이 이루어진 경우는 상관이 없지만
다시 보지 않기 를 선택한 경우 앱권한이 없기에 어떻게 해야 할지 막막.
최초 권한 체크..
/**추상화를 통한 객체생성 금지. only extends */
public abstract class BaseActivity extends AppCompatActivity {
/**
* 퍼미션 체크 인터페이스
*/
public interface PermissionCheckListener {
/**
* 퍼미션 허용이 끝나면 끝나는 시점 초기화 시작구간을 콜백으로 구현
* <p>
* 어디서든 등록하고 액티비티에서 콜백으로 지정을 한다
*/
void permissionCheckFinish();
}
public PermissionCheckListener permissionCheckListener;
public void setPermissionCheckListener(PermissionCheckListener permissionCheckListener) {
this.permissionCheckListener = permissionCheckListener;
}
private final int PERMISSION_REQUEST = 1000;
/**
* 스트링 배열로 퍼미션 체크.
*/
public boolean permissionCheck(String[] strings) {
boolean check = false;
// //안드로이드 마시멜로 이후 퍼미션 체크.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
for (int i = 0; i < strings.length; i++) {
if (ContextCompat.checkSelfPermission(this, strings[i]) == PackageManager.PERMISSION_DENIED) {
ActivityCompat.requestPermissions(this, strings, PERMISSION_REQUEST);
check = true;
break;
}
}
}
return check;
}
/**
* 거부를 했을때 처리
* <p>
* <p>
* <p>
* 다시보지 않기 체크 후 거부를 하면 설정에서 권한을 허용하도록 요청.
* <p>
* 허용하지 않을 경우 앱 사용 을 못함..
* <p>
* 처리를 잘못하면 무한 반복할 경우가 생김.
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PERMISSION_REQUEST) {
Log.e("bear", "권한 허용이 안된것을 확인해야한다..");
// //안드로이드 마시멜로 이후 퍼미션 체크.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] == 0) {
Log.w("bear", "권한이 승락된 것은 ??? " + permissions[i]);
if (grantResults.length == (i + 1)) {
Log.e("bear", "인터페이스로 한곳에 모아서 앱을 실행하도록 한다...");
permissionCheckListener.permissionCheckFinish();
}
} else {
Log.e("bear", "권한 거절 것은 ??? " + permissions[i]);
// 거부한 이력이 있으면 true를 반환한다.
if (shouldShowRequestPermissionRationale(permissions[i])) {
Log.e("bear", "사용자가 다시 보지 않기에 체크를 하지 않고, 권한 설정을 거절한 이력이 있는 경우");
ActivityCompat.requestPermissions(this, permissions, PERMISSION_REQUEST);
break;
} else {
Log.e("bear", "사용자가 다시 보지 않기에 체크하고, 권한 설정을 거절한 이력이 있는 경우.");
new AlertDialog.Builder(this)
.setTitle("다시보지않기 클릭.")
.setMessage(permissions[i] + " 권한이 거부되었습니다 설정에서 직접 권한을 허용 해주세요.")
.setNeutralButton("설정", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivity(intent);
Toast.makeText(getApplicationContext(), "권한 설정 후 다시 실행 해주세요.", Toast.LENGTH_SHORT).show();
finish();
}
})
.setPositiveButton("확인", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getApplicationContext(), "권한 설정을 하셔야 앱을 사용할 수 있습니다.", Toast.LENGTH_SHORT).show();
finish();
}
})
.setCancelable(false)
.create().show();
}// shouldShowRequestPermissionRationale /else
} // 권한 거절
} // for end
}//Build.VERSION.SDK_INT end
}//requestCode end
}
}
매인 액티비티에서 동작 .
이걸 따로 클래스화 한다????음.
2개의 메서드 로 대체 .....
'Android > 소스' 카테고리의 다른 글
디펜던시. (0) | 2018.06.04 |
---|---|
안드로이드 연속클릭 방지 클래스. (0) | 2018.05.23 |
안드로이드 리스트뷰 예제 (0) | 2018.03.22 |
프레그먼트 생성. (0) | 2018.03.09 |
안드로이드 리사이클러뷰(RecyclerView) 정리. (0) | 2018.02.02 |