Develop/Java

[Java] 자바 Android 권한 요청 한번에 처리하기

JunJangE 2021. 8. 7. 13:37

안드로이드 개발을 하다보면 권한 요청을 자주하게 되는데 매 순간마다 권한 요청을 받는 것이 번거롭다고 생각하여 권한 요청을 한번에 처리하는 코드를 작성해보았다.

주석을 잘 확인하면서 코드를 작성하면 좋을 것 같다.

우선 모든 권한 요청을 처리할 파일을 하나 만들자.

예제에서는 PermissionSupport.java로이름을 지었다.

PermissionSupport

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;
    
    // Manifset에 권한을 작성 후
    // 요청할 권한을 배열로 저장
    private String[] permissions = {
            Manifest.permission.CAMERA,
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.SYSTEM_ALERT_WINDOW,


    };

    // 권한 요청을 할 때 발생하는 창에 대한 결과값
    private List<Object> permissionList;

    private final int MULTIPLE_PERMISSIONS = 1023 ;


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

        return permissionList.isEmpty();
    }

    // 권한 허용 요청
    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){


        if (requestCode == MULTIPLE_PERMISSIONS && (grantResults.length > 0)){
            for(int i =0; i < grantResults.length ; i ++){

                // grantResults == 0 사용자가 허용한 것
                // grantResults == -1 사용자가 거부한 것
                if(grantResults[i] == -1){
                    return false;
                }
            }
        }
        return true;
    }

}

MainActivity

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Build;
import android.os.Bundle;
import org.jetbrains.annotations.NotNull;

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 @NotNull String[] permissions, @NonNull @NotNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        // 리턴이 false일 경우 다시 권한 요청
        if (!permission.permissionResult(requestCode, permissions, grantResults)){
            permission.requestPermission();
        }
    }
}

위 코드를 모두 작성하고 실행시키면 다음 실행화면과 같이 나오는 것을 확인할 수 있다.

<실행 화면>

참고

 

[Android / Java] Multi Permissions 사용 방법

안녕하세요. IT 김군입니다. 오늘은 Android를 개발하신다면 모두 사용하실만한 Multi Permissions에 대해 메모해보도록 하겠습니다. 각각 개별로 Permission 요청하는 방법에 대해서는 설명이 잘 나와있

devkimgoon.tistory.com

github

 

GitHub - junjange/Java-Learning: 자바 학습

자바 학습. Contribute to junjange/Java-Learning development by creating an account on GitHub.

github.com