'MultiPermissions'에 해당하는 글 1건

안녕하세요. 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 완성입니다!

 

혹시나 해당 메모에서 잘못된 부분이나 이해하시기 어려운 부분이 있으시다면 댓글로 달아주세요.

 

오늘의 메모는 여기서 마무리 하도록 하겠습니다.

 

감사합니다.


WRITTEN BY
IT김군
S/W 개발자 김군의 메모장

,