Android6.0 런타임 권한

3550 단어 필기
공식 실행 시 권한 요청 방법
  • 런타임 권한 핵심 방법(Android 6.0(API level 23) 및 그 이상) 시스템 권한이 있는지 확인
    context.checkPermission(permission, Process.myPid(), Process.myUid())
    
  • 지정된 시스템 권한 요청: 시스템 대화 상자가 팝업
    activity.requestPermissions(permissions, requestCode);
    fragment.requestPermissions(permissions, requestCode);
    
  • 개발자가 정의한 대화상자를 팝업해야 하는지 검사: 사용자가 사용 권한을 거부한 후 요청 조작(예를 들어 사진)을 다시 눌렀을 때 개발자가 정의한 대화상자를 팝업한다.
     //          ,        (   ) ,  true;
     //           ,  false; 
     activity.shouldShowRequestPermissionRationale(permission);
     fragment.shouldShowRequestPermissionRationale(perm);
    

  • 타사 프레임워크를 사용한 런타임 사용 권한(EasyPermissions)
    GitHub 소스 주소
    사용법(문자 총 읽기 예)
    public class MainActivity extends AppCompatActivity 
    implements EasyPermissions.PermissionCallbacks //  EasyPermissions       
    {
    
        //      
        public static final int CODE_READ_SMS = 0;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
        public void onclick(View view) {
            readSmsCount();
        }
    
        /**
         *     
         *        (  :        )
         */
        @AfterPermissionGranted(CODE_READ_SMS)
        public void readSmsCount() {
            String[] perms = new String[] {
                    Manifest.permission.READ_SMS,
                    Manifest.permission.READ_EXTERNAL_STORAGE
            };
    
            //        
            // this:   Activity,Activity      EasyPermissions.PermissionCallbacks
            if (EasyPermissions.hasPermissions(this, perms)) {
                //    ,        
                // AsyncQueryHandler
                int count = -1;
                Cursor cursor = getContentResolver().query(Uri.parse("content://sms"),
                        null, null, null, null);
                if (cursor != null) {
                    count =  cursor.getCount();
                    cursor.close();
                }
                Toast.makeText(this, "    :" + count, Toast.LENGTH_SHORT).show();
    
            } else {
                //    ,       
                //   1:   Activity
                //   2:                     
                //   3:        
                //   4:  
                EasyPermissions.requestPermissions(this,
                        "          ...",
                        CODE_READ_SMS, perms);
            }
        }
    
        //           
        @Override
        public void onPermissionsGranted(int requestCode, List perms) {
            System.out.println("-----------------       ");
        }
    
        //           
        @Override
        public void onPermissionsDenied(int requestCode, List perms) {
            System.out.println("-----------------       ");
        }
    
        //                    
        @Override
        public void onRequestPermissionsResult(int requestCode,
                                               @NonNull String[] permissions,
                                               @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
            System.out.println("-----------------onRequestPermissionsResult");
        }
    }
    

    부록:
  • 권한 신청 공식 문서https://developer.android.com/training/permissions/index.html과학적인 인터넷 필요
  • 오픈 소스 프로젝트https://github.com/googlesamples/easypermissions https://github.com/Karumi/Dexter https://github.com/hotchemi/PermissionsDispatcher
  • 좋은 웹페이지 즐겨찾기