본문 바로가기
Android/Android Lab

안드로이드 권한 체크 구현(Permission Check)

by 수쓰뎁 2023. 9. 19.


Abstract.

안드로이드 알람 기능을 구현하는 프로젝트를 진행하면서 퍼미션 체크가 제대로 되지 않아 삽질을 한 경험이 있다. 이전에는 단순히 AndroidManifest.xml에서 <uses-permission> 태그를 사용하여 필요한 권한을 등록하는 것으로 앱이 설치될 때 권한 등록이 되도록 기능을 사용했었는데, 안드로이드 SDK 23 이상부터는 앱이 실행되었을 때 권한 등록이 별도로 필요하다. 이것 때문에 알람기능이 계속 작동하지 않은 경험이 있었기에 이번 포스팅에서는 권한설정 기능을 일괄로 묶어서 앱이 실행될 때 퍼미션 체크를 할 수 있도록 구현해본다.

반응형

퍼미션 체크 구현

퍼미션 체크를 구현하기 위해서 가장 먼저 사용하고자 하는 퍼미션을 AndroidManifest.xml에 등록한다. 가장 흔하게 사용하는 알람 기능 관련 퍼미션을 사용해본다. 

 

1. AndroidManifest.xml

<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.USE_EXACT_ALARM" />
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
  • POST_NOTIFICATIONS
  • USE_EXACT_ALARM
  • SCHEDULE_EXACT_ALARM
  • FOREGROUND_SERVICE

 

2. PermissionUtils.java

권한 설정 일괄 체크 구현을 위해 다음과 같이 PermissionUtils 클래스를 만든다. 앱에서 사용할 권한 허용을 요청하는 기능을 해당 클래스에 작성하여 앱이 실행되었을 때 권한 허용이 누락되어 기능이 정상적으로 작동하지 않는 문제를 방지할 수 있다.

public class PermissionUtils {

    private Context context;
    private Activity activity;

    // Manifest에 권한을 작성 후
    // 요청할 권한을 배열로 저장
    private String[] permissions = {
            android.Manifest.permission.POST_NOTIFICATIONS,
            android.Manifest.permission.USE_EXACT_ALARM,
            android.Manifest.permission.SCHEDULE_EXACT_ALARM,
            Manifest.permission.FOREGROUND_SERVICE,
    };


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

    public PermissionUtils(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;
    }

}

 

 

2. MainActivity.java

PermissionUtils에서 정의된 권한체크의 실행을 위해 MainActivity.java 파일에서 다음과 같이 코드를 작성한다. 앱이 실행되어 MainActivity.java의 화면이 실행되면 권한 설정을 위한 알람이 나타난다. 

public class MainActivity extends AppCompatActivity {

    private PermissionUtils 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 PermissionUtils(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();
        }
    }

}

퍼미션 체크 구현 결과

앱 실행 시 앱에서 사용할 모든 권한을 일괄 허용할 수 있는 기능을 구현해보았다. 

화면 하단에 알람에 대한 권한 허용을 묻는 다이얼로그가 나타나 구현한 기능이 정상 작동하는 것을 확인할 수 있다. 이렇게 사전에 앱의 권한을 설정함으로써 기능이 정상적으로 작동하지 않는 문제를 해결할 수 있다. 권한 설정 기능을 담은 PermissionUtils.java를 작성하여 해당 클래스를 권한 설정을 묻는 다이얼로그를 표시할 액티비티에 연결하여 사용하면 된다.

반응형

댓글