ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 안드로이드 마시멜로우(Android 6.0) 권한요청 - System Dialog( 1/2 )
    Android 2019. 4. 10. 17:52

    이전에는 앱설치 할때AndroidManifest.xml에 등록해둔 필요권한을 보여주고 설치와 동시에 권한을 얻었지만

    안드로이드 targetSDK23이상을 빌드하게되면서 앱에서 해당 권한이 필요할때 마다 사용자로부터 권한을 허가 받도록 해야한다.

     

    모든 권한을 요청을 해야하는것은 아니고 구글에서 정의한 Dangerous Permission에 대해서만 권한을 허가하도록 해주면 된다.

     

     

     

     

    개발소스를 보기전에 어떤 프로세스로 권한을 요청하는지 보자.

     

    첫번째 - 권한 요청 ( System Dialog )

    두번째 - 권한 재요청 ( Custom Dialog ) - 첫번째에서 거절을 했을때 다시한번 사용자에게 권한을 요청한다.

     

     

    첫번째에서 권한을 얻는 절차를 끝낼 수도 있지만 재요청하는 팝업창을 하나 더 만든 이유가 있다. 바로 한번 거부를 한 이유 다시 권한을 요청하게 되면 시스템 다이얼로그가 뜰때 다시 묻지 않음 체크박스가 같이 나온다.

     

    이때 다시 묻지 않음을 체크하고 거부를 누르면 다음부터는 해당권한을 허용할 수 있는 팝업창이 뜨지 않게 된다. 이 상황을 대처하기 위해서

    Custom Dialog를 만들게 되었다. 

     

    App을 사용하기 위해서 꼭 필요한 권한들이 있는 경우, 대게 앱을 실행하자마자 필수 권한들을 받는 앱들이 있다. Custom Dialog가 없는 경우 다시 묻지 않음을 누르고 거부를 누르고 그 앱을 실행하면 아무런 반응이 없을것이다. 다시 묻지 않음을 하고 거부했을 시 해당권한이 있는지를 확인하여 Custom Dialog를 띄워 다시 고객이 직접 권한을 허용할 수 있는 화면으로 갈 수 있도록 유도한다.

     

     

     

     

     

    하지만 SMS인증번호를 후킹해주는 기능은 사실 사용자의 편리함을 주기 위함이지 꼭 필요한 기능은 아니다. 이런 권한에 대해서는 System Dialog로만 권한을 허용하거나 거부하고 다시한번 요청할 필요는 없다. ( 현재 SMS READ하는 권한은 특별한 상황이 아니면 구글에서 제한했다. )

     

     

     

    이번 글(System Dialog 1/2)에서는 System Dialog 까지만 띄우는 걸로 글을 쓰고  Custom Dialog 띄우는것은 다음글 (Custom Dialog 2/2)에서 작성하겠다.

     

    소스 구현하기

     

     

    1. AndroidManifest.xml

    1
    2
    3
     
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
     

     

     

    2. PermissionUtil.java

     

     

    - requestPermission()

    System Dialog를 호출한다. ActivityCompat.requestPermissions()가 실행될때 팝업이 show된다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    /**
     * 필요한 권한 배열로 받아서 순차적으로 권한요청
     * OS System 팝업.
     */
     
    public static void requestPermission(Activity activity, String[] permission ) {
           try{
             //요청한 권한들중에 1개라도 거절된것이 있다면 false
             //모두 허용되었다면 true
             if (checkPermissions(activity, permission)) {
     
                 //권한허용되어있음
                 //원하는 기능 수행
     
             } else {
     
                 //권한없음
                 //권한요청 system dialog show
                 ActivityCompat.requestPermissions(activity, permission, REQUEST_PERMISSION);
             }
       }catch (Exception e){
     
       }
    }
     
    Colored by Color Scripter

     

     

    - 생성자 및 변수설정

    1
    2
    3
    4
    5
    6
    7
     
    public static final int REQUEST_PERMISSION = 1;
    Context mContext;
     
    public PermissionUtil(Context context) {
        mContext = context;
    }
     
    Colored by Color Scripter

     

    - checkPermissions()

    System Dialog를 띄우기전에 요청한 권한들이 모두 허용되어있는지 거부되어있는것이 있는지 확인한다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    // 배열로 들어온 권한들중에 모두 허용상태라면 true
    // 한개라도 거부상태라면 false
     
    public static boolean checkPermissions(Activity activity, String[] list) {
       try{
            for (String permission : list) {
                    if (ActivityCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED) {
                       return false;
                }
            }
     
       }catch(Exception e){
       
       }
     
       return true;
    }
     
    Colored by Color Scripter

     

     

    - verifyPermission()

    System Dialog 결과를 반환하는 콜백함수(onRequestPermissionsResult)에서 int배열로 허용여부가 내려온다.

    이 값을 가지고 다시 Custom Dialog를 통해 다시 요청할지, 모든 권한을 받았다면 그대로 진행할지를 판단한다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    /**
     * onRequestPermissionsResult()
     * System Dialog 콜백함수 결과 파라메타중 권한 허용여부 확인.
     */
    public static boolean verifyPermission(int[] grantresults) {
     
         try {
         
            if(grantresults.length < 1) {
                 return false;
            }
     
            for (int result : grantresults) {
                if(result != PackageManager.PERMISSION_GRANTED) {
                     return false;
                }
            }
         }catch (Exception e){
         }
         
         return true;
    }
    Colored by Color Scripter

     

     

     

     

    3. MainActivity.java

     

     

    - 변수 정의 및  권한허용 System Dialog 실행

     
    1
    2
    3
    4
    5
     
    String mPermissions = "android.permission.READ_PHONE_STATE,android.permission.READ_EXTERNAL_STORAGE,android.permission.WRITE_EXTERNAL_STORAGE";
    String[] array_permissions = mPermissions.split(",");
     
    PermissionUtil permissionUtil = new PermissionUtil(MainActivity.this);
    permissionUtil.requestPermission(MainActivity.this, array_permissions);
     
    Colored by Color Scripter

     

     

    - onRequestPermissionsResult()

    System Dialog 콜백함수. else문 안에 있는 소스는 Custom Dialog 호출하는 부분이다. 이부분 소스는 다음글에 있으니 참고하면 된다.

    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
    //권한요청 System Dialog 콜백 
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
     
         try{
              if(requestCode == PermissionUtil.REQUEST_PERMISSION) {
     
              //grantResult는 requestPermissions에서 요청된 String[]순서로 들어옴. 0~N개로 결과를 탐색하면 된다.
              if(permissionUtil.verifyPermission(grantResults)) {
               
                  //권한있음
                  //원하는 기능 수행    
              }else {
                 
                 //권한없음
                 //필수권한이면 Custom Dialog 통해 다시한번 요청
                 //선택권한이면 아래 주석처리하고 프로세스대로 진행할수 있게끔 처리
                 PermissionUtil permissionUtil = new PermissionUtil(MainActivity.this);
                 permissionUtil.showRequestAgainDialog(array_permissions);
              }
          }
     
        }catch(Exception e){
        }
     
    }
    Colored by Color Scripter

     

     

     

     

    안드로이드 마시멜로우(Android 6.0) 권한요청 - Custom Dialog( 2/2 )

    https://justbobby.tistory.com/17

     

    안드로이드 마시멜로우(Android 6.0) 권한요청 - Custom Dialog( 2/2 )

    이번 글에서는 System Dialog에서 거부를 한 이후에 다시한번 사용자에게 권한허용을 요청하는 Custum Dialog를 생성을 해보겠다. 목표는 아래와 같은 다이얼로그를 만드는것이다. 이전글에서 만든 java파일에 몇..

    justbobby.tistory.com

     

    댓글

Designed by Tistory.