Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

맨땅에 코딩

[안드로이드] 권한 요청 팝업 (한번에 여러개 요청) 본문

앱 개발/Java

[안드로이드] 권한 요청 팝업 (한번에 여러개 요청)

맨땅 2022. 1. 3. 15:09

목차

    반응형

     

     

    앱을 실행하자마자 필요한 권한들을 한번에 요청하기 위한 코드

    Multi Permission(멀티 퍼미션)을 사용한 다중 권한 요청

     

     


     

     

    우선 AndroidManifiest에 필요한 권한들을 추가해줍니다.

    https://developer.android.com/reference/android/Manifest.permission

     

    Manifest.permission  |  Android Developers

     

    developer.android.com

    여기서 필요한 권한을 확인해주신 후 추가해주시면 됩니다

     

     

     

    [ AndroidManifest.xml ]

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>

    저는 전화, 위치에 대한 권한을 추가해주었습니다(총 2개, 그 이상도 추가가 가능합니다)

     

     

     

     

    권한에 대한 Class도 하나 생성해줍니다

    [ PermissionSupport.java ]

    public class PermissionSupport {
    
        private Context context;
        private Activity activity;
    
        //요청할 권한 배열 저장
        private String[] permissions = {
                Manifest.permission.BLUETOOTH,
                Manifest.permission.BLUETOOTH_ADMIN,
                Manifest.permission.ACCESS_COARSE_LOCATION,
                Manifest.permission.READ_PHONE_STATE,
                Manifest.permission.ACCESS_FINE_LOCATION
    
        };
        private List permissionList;
    
        //권한 요청시 발생하는 창에 대한 결과값을 받기 위해 지정해주는 int 형
        //원하는 임의의 숫자 지정
        private final int MULTIPLE_PERMISSIONS = 1023; //요청에 대한 결과값 확인을 위해 RequestCode를 final로 정의
    
        //생성자에서 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, (String[]) 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;
        }
    
    }

     

     

     

     

     

    권한에 대한 요청을 불러올 Activity의 onCreate 부분에 권한에 대한 클래스를 활용할 함수를 만들어줍니다

     

    [ MainActivity.java ]

    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() {
    
            // PermissionSupport.java 클래스 객체 생성
            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();
            }
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    
    
    }

     

     

     

    그 후 핸드폰을 실행해주시면 코드를 작성한 Activity 창이 열렸을때 아래 권한 요청 팝업이 뜹니다

     

     

     

     

    거부를 누르게 되면 다시 요청하는 팝업이 뜨면서 아래 '다시 묻지 않음' 체크박스가 생성됩니다

     

     

    여기서 '다시 묻지 않음' 체크박스 선택 후 거부를 하게되면 팝업창이 다시 뜨지 않으니 권한 허용이 꼭 필요한 기능을 사용시에 핸드폰 - 설정에 들어가 어플을 일일이 찾아주는 일이 없도록 settings.action_application_details_settings 를 통해 설정 - 앱 정보로 들어가 권한을 요청해주면 된다.

     

    반응형