안녕하세요. IT 김군입니다.
오늘은 Android를 개발하신다면 모두 사용하실만한 Multi Permissions에 대해 메모해보도록 하겠습니다.
각각 개별로 Permission 요청하는 방법에 대해서는 설명이 잘 나와있는 곳이 많아서 여러 개를 사용하는 것만 메모하겠습니다.
우선 오늘도 파일을 나누어서 시작하겠습니다.
오늘은 패키지 안에 support라는 폴더를 생성했고
그 안에 PermissionSupport.java 파일을 만들었습니다.
추후 관리의 편의성을 위해 제 자신만의 방법으로 폴더를 구분하고 파일을 나눈 것이라서
이 방법이 불편하신 분들은 그냥 Activity에 코딩하셔도 상관 없습니다!
그럼 PermissionSupport.java의 소스를 먼저 보도록 하겠습니다.
// #### PermissionSupport.java ####
package com.itkim.exam.permissionsexam.support;
import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import java.util.ArrayList;
import java.util.List;
public class PermissionSupport {
private Context context;
private Activity activity;
// 요청할 권한을 배열로 저장해주었습니다.
private String[] permissions = {
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.READ_CONTACTS,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
private List permissionList;
// 이 부분은 권한 요청을 할 때 발생하는 창에 대한 결과값을 받기 위해 지정해주는 int 형입니다.
// 본인에 맞게 숫자를 지정하시면 될 것 같습니다.
private final int MULTIPLE_PERMISSIONS = 1023;
// 생성자에서 Activity와 Context를 파라미터로 받았습니다.
public PermissionSupport(Activity _activity, Context _context){
this.activity = _activity;
this.context = _context;
}
// 허용 받아야할 권한이 남았는지 체크
public boolean checkPermission(){
int result;
permissionList = new ArrayList<>();
// 위에서 배열로 선언한 권한 중 허용되지 않은 권한이 있는지 체크
for(String pm : permissions){
result = ContextCompat.checkSelfPermission(context, pm);
if(result != PackageManager.PERMISSION_GRANTED){
permissionList.add(pm);
}
}
if(!permissionList.isEmpty()){
return false;
}
return true;
}
// 권한 허용 요청
public void requestPermission(){
ActivityCompat.requestPermissions(activity, permissionList.toArray(new String[permissionList.size()]), MULTIPLE_PERMISSIONS);
}
// 권한 요청에 대한 결과 처리
public boolean permissionResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults){
// 우선 requestCode가 아까 위에 final로 선언하였던 숫자와 맞는지, 결과값의 길이가 0보다는 큰지 먼저 체크했습니다.
if(requestCode == MULTIPLE_PERMISSIONS && (grantResults.length > 0)){
for(int i=0; i < grantResults.length ; i++){
//grantResults 가 0이면 사용자가 허용한 것이고 / -1이면 거부한 것입니다.
// -1이 있는지 체크하여 하나라도 -1이 나온다면 false를 리턴해주었습니다.
if(grantResults[i] == -1){
return false;
}
}
}
return true;
}
}
해당 Class의 큰 흐름을 보면 이렇습니다.
1. 우선 요청할 권한들을 String 배열을 선언하여 넣어주었습니다.
2. 요청에 대한 결과값을 확인하기 위해 RequestCode를 Final로 정의해주었습니다. (MULTIPLE_PERMISSIONS)
3. checkPermission() 함수를 통해 위에서 배열로 선언한 권한 중 허용되지 않은 권한이 있는지 체크하였습니다.
4. requestPermission() 함수에서는 위에서 배열로 선언한 권한에 대해 사용자에게 허용 요청을 하였습니다.
5. permissionResult() 함수에서는 요청한 권한에 대한 결과값 판단하도록 하였습니다.
주석도 제 나름대로 상세하게 달아놓아서 이해가 잘 안되시는 분들은 주석을 참고하셔도 될 것 같습니다.
그럼 이제 이 클래스를 Activity에서 활용하는 방법에 대해서 보도록 하겠습니다.
// #### MainActivity.java ####
package com.itkim.exam.permissionsexam;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Build;
import android.os.Bundle;
import com.itkim.exam.permissionsexam.support.PermissionSupport;
public class MainActivity extends AppCompatActivity {
// 방금 전 만들었던 클래스를 선언해줍니다.
private PermissionSupport permission;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
permissionCheck();
}
// 권한 체크
private void permissionCheck(){
// SDK 23버전 이하 버전에서는 Permission이 필요하지 않습니다.
if(Build.VERSION.SDK_INT >= 23){
// 방금 전 만들었던 클래스 객체 생성
permission = new PermissionSupport(this, this);
// 권한 체크한 후에 리턴이 false로 들어온다면
if (!permission.checkPermission()){
// 권한 요청을 해줍니다.
permission.requestPermission();
}
}
}
// Request Permission에 대한 결과 값을 받아올 수 있습니다.
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
// 여기서도 리턴이 false로 들어온다면 (사용자가 권한 허용을 거부하였다면)
if(!permission.permissionResult(requestCode, permissions, grantResults)){
// 저의 경우는 여기서 다시 Permission 요청을 걸었습니다.
permission.requestPermission();
}
}
}
MainActivity에서 활용법을 보시면 굉장히 간단합니다.
우선 위에서 만들었던 Class를 활용하기 위해 객체를 생성해준 후 check / request를 통해 권한을 요청했습니다.
그리고 아래 보시면 onRequestPermissionResult 가 있는데 이 부분은
Ctrl + O 단축키를 통해 오버라이드 하실 수 있습니다.
요청한 권한에 대한 결과 값을 얻어올 수 있는 함수입니다.
위 MainActivity까지 완료하셨다면 여러 개의 권한을 한 번에 요청할 수 있는 Multi Permissions 완성입니다!
혹시나 해당 메모에서 잘못된 부분이나 이해하시기 어려운 부분이 있으시다면 댓글로 달아주세요.
오늘의 메모는 여기서 마무리 하도록 하겠습니다.
감사합니다.
'Android 개발 메모장' 카테고리의 다른 글
[Android] App icon (앱아이콘) 변경 및 적용하기 (11) | 2019.08.30 |
---|---|
[Android / Java] SQLite 간단 사용 방법 (1) | 2019.08.27 |
[Android] AAR Library 추가하기 (1) | 2019.08.26 |
[Android / Java] Custom ActionBar 만들기 (+공백 채우기) (8) | 2019.08.24 |
Android APK 디컴파일 방법 (1) | 2018.01.08 |
WRITTEN BY
- IT김군
S/W 개발자 김군의 메모장