투케이2K

16. (AndroidStudio/android/java) 다중 퍼미션 (multi permissions) 요청 및 응답 처리 실시 본문

Android

16. (AndroidStudio/android/java) 다중 퍼미션 (multi permissions) 요청 및 응답 처리 실시

투케이2K 2021. 1. 21. 17:44

/* =========================== */

[ 개발 환경 설정 ]

개발 툴 : AndroidStudio

개발 언어 : java

/* =========================== */

/* =========================== */

[소스 코드]

 

<!-- ====== 퍼미션 등록 ====== -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>



//TODO ====== 다중 퍼미션 데이터 선언 ======/
/** [사용 방법]
 * 1. permissionArray 배열에 퍼미션 허용 받을 데이터를 담는다
 * 2. getPermissionCheck() 메소드를 호출해서 퍼미션 허용 여부를 확인한다
 * 3. getPermissionOK() 메소드에 모든 퍼미션이 허용된 경우 수행할 로직을 작성하면된다
 */
String[] permissionArray = {
		Manifest.permission.READ_PHONE_STATE,
		Manifest.permission.ACCESS_COARSE_LOCATION,
		Manifest.permission.ACCESS_FINE_LOCATION,
		Manifest.permission.CAMERA
};



//TODO ====== 정상 모든 퍼미션 허용 시 수행 메소드 ======/
public void getPermissionOK(){
	try {
		//TODO ==== 내용 작성 ====

	}
	catch (Exception e){
		e.printStackTrace();
	}
}



//TODO ====== 다중 퍼미션 확인 메소드 ======/
public void getPermissionCheck(){
	try {
		ArrayList <String> permissionOK = new ArrayList(); //퍼미션 허용된 값을 담는다
		ArrayList <String> permissionNO = new ArrayList(); //퍼미션 거부된 값을 담는다
			if(permissionArray.length > 0){ 
			int check = 0;
			for (String data : permissionArray) { //매니페스트에 등록된 허용받을 퍼미션이 허용되었는지 확인한다
				check = ContextCompat.checkSelfPermission(A_Alert.this, data);
				if (check != PackageManager.PERMISSION_GRANTED) { //권한이 부여되지 않았을 경우
					permissionNO.add(data);
				}
				else { //퍼미션 권한이 부여 되었을 경우
					permissionOK.add(data);
				}
			}
			Log.d("---","---");
			Log.w("//===========//","============");
			Log.d("","\n"+"[퍼미션 허용된 리스트 : "+permissionOK.toString()+"]");
			Log.d("","\n"+"[퍼미션 거부된 리스트 : "+permissionNO.toString()+"]");
			Log.w("//===========//","============");
			Log.d("---","---");
			if(permissionNO.size() > 0){ //TODO 퍼미션 거부된 값이 있을 경우
				ActivityCompat.requestPermissions(A_Alert.this, permissionNO.toArray(new String[permissionNO.size()]), MULTI_PERMISSION);
			}
			else { //TODO 모든 퍼미션이 허용된 경우 [메소드 호출]
				//Toast.makeText(getApplication(),"모든 퍼미션이 허용되었습니다 !!! ",Toast.LENGTH_SHORT).show();
				getPermissionOK(); //메소드 호출
			}
		}
		else {
			Toast.makeText(getApplication(),"퍼미션 허용을 확인할 데이터가 없습니다 ... ",Toast.LENGTH_SHORT).show();
		}
	}
	catch (Exception e){
		e.printStackTrace();
	}
}
final int MULTI_PERMISSION = 999;
ArrayList <String> permissionNoRealTime = new ArrayList(); //실시간 퍼미션 거부된 값을 담는다
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
	switch (requestCode) {
		case MULTI_PERMISSION: {
			if (grantResults.length > 0) { //퍼미션 권한이 부여되지 않는 배열 길이가 0보다 클경우
				if(permissionNoRealTime.size() > 0){
					permissionNoRealTime.clear();
				}
				for (int i = 0; i < permissions.length; i++) { //배열을 순회하면서
					if (grantResults[i] != PackageManager.PERMISSION_GRANTED) { //권한이 부여되어 있지 않을 경우 확인
						permissionNoRealTime.add(permissions[i]);
					}
				}
				Log.d("---","---");
				Log.e("//===========//","============");
				Log.d("","\n"+"[실시간 퍼미션 거부된 리스트 : "+permissionNoRealTime.toString()+"]");
				Log.e("//===========//","============");
				Log.d("---","---");
				if(permissionNoRealTime.size() > 0){ //TODO 실시간으로 권한 허용이 거부된 값이 있을 경우
					String Tittle = "퍼미션 허용 확인";
					String Message = "퍼미션을 허용해야 정상 이용가능합니다"+"\n"
							         +"[설정>권한]에서 퍼미션을 허용하시거나, "+"\n"
							         +"앱을 재실행해 권한을 허용해주세요";
					String buttonNo = "종 료";
					String buttonYes = "설 정";
					new AlertDialog.Builder(A_Alert.this)
							.setTitle(Tittle) //팝업창 타이틀 지정
							//.setIcon(R.drawable.ic_launcher_foreground) //팝업창 아이콘 지정
							.setMessage(Message) //팝업창 내용 지정
							.setCancelable(false) //외부 레이아웃 클릭시도 팝업창이 사라지지않게 설정
							.setPositiveButton(buttonYes, new DialogInterface.OnClickListener() {
								@Override
								public void onClick(DialogInterface dialog, int which) {
									// TODO Auto-generated method stub
									/** ==== [애플리케이션 정보 창 이동하기] ==== */
									Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
									intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
									Uri uri = Uri.fromParts("package", getPackageName(), null);
									intent.setData(uri);
									startActivity(intent);
									overridePendingTransition(0,0);
								}
							})													
							.setNegativeButton(buttonNo, new DialogInterface.OnClickListener() {
								@Override
								public void onClick(DialogInterface dialog, int which) {
									// TODO Auto-generated method stub
									try {
										finishAffinity();
										overridePendingTransition(0,0);
										//android.os.Process.killProcess(android.os.Process.myPid());
									}
									catch (Exception e){
										e.printStackTrace();
									}
								}
							})							
							.show();
				}
				else { //TODO 실시간으로 모든 권한이 허용된 경우 [메소드 호출]
					getPermissionOK(); //메소드 호출
				}
			}
			return;
		}
	}
}

/* =========================== */

[결과 출력]

/* =========================== */

/* =========================== */

[요약 설명]

* 1. permissionArray 배열에 퍼미션 허용 받을 데이터를 담는다

* 2. getPermissionCheck() 메소드를 호출해서 퍼미션 허용 여부를 확인한다

* 3. getPermissionOK() 메소드에 모든 퍼미션이 허용된 경우 수행할 로직을 작성하면된다

/* =========================== */

반응형
Comments