안드로이드 개발을 하다보면 권한 요청을 자주하게 되는데 매 순간마다 권한 요청을 받는 것이 번거롭다고 생각하여 권한 요청을 한번에 처리하는 코드를 작성해보았다.
주석을 잘 확인하면서 코드를 작성하면 좋을 것 같다.
우선 모든 권한 요청을 처리할 파일을 하나 만들자.
예제에서는 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();
}
}
}
위 코드를 모두 작성하고 실행시키면 다음 실행화면과 같이 나오는 것을 확인할 수 있다.
참고
github
'Develop > Java' 카테고리의 다른 글
[Java] 자바 Android 튜토리얼 페이지 구현 (3) | 2021.08.11 |
---|---|
[Java] 자바 Android 액티비티나 서비스에서 다른 서비스 종료시키기 (0) | 2021.08.05 |
[Java] 자바 Android UsageStatsManage를 통해 현재 실행중인 앱 확인 (1) | 2021.07.22 |
[AWS] 아마존 웹 서비스 Android + Amazon Cognito 에러 메시지 (0) | 2021.07.21 |
[Java] 자바 Android 다이얼로그(Dialog) 구현 (0) | 2021.07.19 |