패키지 버전 요청 권한 도구 위 Android6.0 (API 23)의 경우

허가 만 요청이 포장을 구현하는 응용 프로그램을 실행할 수있는 권한을 요청하는 데 필요한 반사 기술 도구를 사용하여 패키지는 비즈니스 방법은 비 반사 호출 매개 변수 목록입니다.

참조 예 : https://github.com/googlesamples/android-RuntimePermissionsBasic/  이 링크는 카메라를 사용하는 내부 요청 권한을 때 실행할 수있는 권한을 요청하는 방법을 보여줍니다.

I 캡슐화 도구 클래스 코드는 다음과 같이 :

1.GetPermissionUtils.java 

패키지 com.aaa.aContacts, 

가져 오기 android.app.Activity에서,
 가져 오기 android.content.ContentResolver,
 가져 오기 android.content.Context,
 가져 오기 android.content.pm.PackageManager,
 가져 오기 android.widget.Toast,
 가져 오기 androidx.core.app .ActivityCompat,
 가져 오기 java.lang.reflect.Method와는;
 / ** 
 * 저자 : 2019년 8월 9일 15시 56분에 케빈 
 반사 캡슐화 툴에 의해 요청 된 실행 권한 * 시스템의 안드로이드 6.0 버전 이상 
 * 반사 기본 홈페이지 호출 이 클래스 매개 변수없이 된 .java 비즈니스 방법 목록 
 * / 
공용  클래스 GetPermissionUtils 구현 ActivityCompat.OnRequestPermissionsResultCallback { 

    개인상황 문맥,
     개인 상기 작업 활동 
    클래스를 clazz;             // 클래스 객체, 사용자에 의해 얻어지는 수신 경로 
    문자열 경로;             // 클래스 경로로서 호출자에 의해 전달 com.aaa.aContacts.Main 
    문자열 [] = {} 권한;   // 목록 허가를 신청해야 
    INT의 , 인덱스 = 0               // 권한 권한 배열 인덱스 값 
    문자열 methodName로;           // 활동을 실행하는 데 필요한 허가를 실행할 준비가 비즈니스 메소드 이름 
    방법, 방법 · · ·              // 방법, 개체 예 활동의 비즈니스 방법을 얻기 위해 수행되면 
    개인에게 컨텐트 리졸버 ContentResolver 해결 프로그램을,
     개인  정적  최종  INT의 MY_CODE = 0; 

    / ** 
     * 인수가 있습니다 생성자 
     * @param의 상황에 맞는 애플리케이션 컨텍스트 오브젝트 
     * @param의 활동 현재 활동 
     * @param의 현재 활동 전체 이름 com.aaa.aContacts.Main 경로 
     * @param의 배열 기관의 권한을 적용해야 
     * 파라미터 : 인덱스 인덱스는 배열의 특권 위치 
     * @param methodName로의 ctivity 후에는 방법의 비즈니스 이름 실행할 준비가 실행하는 데 필요한 권한을 얻을
      * / 

    공공 GetPermissionUtils (컨텍스트 컨텍스트, 작업 활동, 문자열 경로, 문자열 []에 권한을 , INT의 인덱스 methodName로 문자열) {
         이 본 .context = 컨텍스트;
         이 본.activity = 활성;
         .path = 경로;
         .permissions = 권한;
         있는 .index = 인덱스;
         .methodName = methodName로;
        시도 { 
            해결 = context.getContentResolver ()를;
             .clazz = Class.forName를 (경로); 
             방법 = clazz.getMethod (methodName로, 새로운 클래스 [] {}); 
        } 캐치 (예외 전자) { 
            e.printStackTrace (); 
        } 
    } 
    //요청 권한 : 어떤 경우, 서비스를 호출하는 직접적인 방법이있는 경우 현재 작업이, 갈 여부 필요한 권한 활동을 감지하는 
    공공  무효 에 checkPermission () {
         INT의 코드 = ActivityCompat.checkSelfPermission (문맥, 권한 [인덱스]);      // 응용 프로그램이 권한을 포함 여부를 검출 
        만약에 (코드 == PackageManager.PERMISSION_GRANTED) {      // 실행할 때 이미 필요한 권한이 
            은 try { 
                Method.invoke (활동, 새로운 새로운 객체 [] {}); 
            } 캐치 (예외 E) { 
                E. 의 printStackTrace (); 
            } 
        } 다른 {      // 실행되지 필요한 권한 
            requestRuntimePermission을 ();    //필요한 권한을 요청할 때 실행 
        } 
    } 
    / ** 
     * 사용자가보고, 또는 허가를 요청할 수있는 권한을 부여하라는 메시지가 표시되는 경우 
     * / 
    공공  무효 ) requestRuntimePermission을 ({      //이 필요한에게 2019년 8월 9일 16시 4분 9초 요청을 실행하는 경우 권한 
        IF (ActivityCompat.shouldShowRequestPermissionRationale (활동, 권한 [인덱스])) { 
            Toast.makeText (context.getApplicationContext (), "축하합니다, 성공적으로 부여 된 권한" , Toast.LENGTH_LONG) .Show (); 
        } 다른 { 
            ActivityCompat.requestPermissions (활동은 권한 MY_CODE); 
        } 
    } 
    @Override    // 2,019 니안 8 유에 9 리 16시 1분 48초 허가 요청 콜백 방법 
    공개  무효onRequestPermissionsResult ( INT의 requestCode가이 문자열 [] 권한이 값 int []를 grantResults) {
         경우 (requestCode가 == MY_CODE) {
             경우 (grantResults.length == 1 && grantResults [0] == PackageManager.PERMISSION_GRANTED) { 
                Toast.makeText (문맥 "恭喜你,成功授予权限" , Toast.LENGTH_LONG) .show ();
                시도 { 
                    method.invoke (활동, 새로운 객체 [] {}); 
                } 캐치 (예외 전자) { 
                    e.printStackTrace (); 
                } 
            } 다른 {
                Toast.makeText (문맥, "나는 당신이 승인 동의하지 않는 미안 해요" , Toast.LENGTH_LONG) .Show (); 
            } 
        } 
    } 
}

2. 활동 Main.java이 테스트는, READ_CONTACTS이 권한을 요청, 당신은 정말 사용할 수 있습니다. 우리는 시뮬레이터에 연락처를 추가 할 필요가, 또는 로그 캣은 정보를 기록하지 않았다.

패키지 com.aaa.aContacts; 

수입 androidx.annotation.NonNull;
수입 androidx.appcompat.app.AppCompatActivity;
수입 androidx.core.app.ActivityCompat; 

수입 android.Manifest;
수입 에는 android.app.Activity;
수입 android.content.ContentResolver;
수입 android.content.Context;
수입 android.content.pm.PackageManager;
수입 android.database.Cursor;
수입 android.net.Uri;
수입 android.os.Bundle;
수입 android.util.Log;
수입 android.view.View에서;
수입android.widget.Toast; 

공용  클래스 주요 확장 AppCompatActivity이 구현   ActivityCompat.OnRequestPermissionsResultCallback { 

    개인 상황에 맞는 appContext을;
    개인 컨텐트 리졸버 ContentResolver 해결;
    개인  정적  최종 문자열 TAG = "메인" ;
    개인  정적  최종  INT의 MY_CODE = 0 ;
    개인 GetPermissionUtils의 getPermissionUtils; 
    @Override 
    보호  공극 에서 onCreate (번들 savedInstanceState) {
         슈퍼 .onCreate (savedInstanceState); 
        된 setContentView (R.layout.main);
        appContext = 주. .getApplicationContext (); 
        리졸버 = appContext.getContentResolver (); 
    } 
    공공  무효 ReadContacts (보기보기) { 
        문자열 경로 = "com.aaa.aContacts.Main" ; 
        문자열 [] permisssions = {Manifest.permission.READ_CONTACTS}; 
        getPermissionUtils = 새로운 GetPermissionUtils (appContext 메인. 이것은 , 경로 permisssions가 0, "읽기" ); 
        getPermissionUtils.checkPermission (); 
        // getPermission (); 
    }
    @Override    // 2019年8月日9 16시 1분 48초请求权限回调方法
    공개  공극 onRequestPermissionsResult ( INT의 requestCode가이 문자열 [] 권한이 값 int {[] grantResults) 
       getPermissionUtils.onRequestPermissionsResult (requestCode가, 권한을 grantResults); 
    } 
    공공  공극 () {판독 
        열린 URI ( "//com.android.contacts/contacts 콘텐츠"를 Uri.parse = ); 
        커서 커서 = resolver.query을 (URI, 새로운 문자열 [] { "_ ID"},  ,  , );
        반면 (cursor.moveToNext ()) {
            INT contactsId cursor.getInt = (0);  // 获取到联系人的ID值 
            의 StringBuilder SB =  의 StringBuilder ( "contactId의" ); 
            sb.append (contactsId); 
            URI = Uri.parse ( "함량 //com.android.contacts/contacts/"+ contactsId + "/ 데이터" ); 
            dataCursor 커서 = resolver.query을 (URI, 새로운 문자열 [] { "마임」, 「DATA1」, 「DATA2」},  ,  , );
            반면 (dataCursor.moveToNext ()) { 
                문자열 데이터 = dataCursor.getString (dataCursor.getColumnIndex ( 「DATA1」// 문자열 유형 = dataCursor.getString (dataCursor.getColumnIndex ( "데이터 2")); 
                문자열 유형 = dataCursor.getString (dataCursor.getColumnIndex ( "MIME 형식" ));
                경우 ( "vnd.android.cursor.item / 이름".equals (식)) {     // 姓名 
                    sb.append ( "NAME ="+ 데이터); 
                } 다른  경우 ( "vnd.android.cursor.item / phone_v2".equals (식)) {   // 电话 
                    sb.append ( "전화 ="+ 데이터); 
                } 다른  경우 ( "vnd.android.cursor.item / email_v2".  데이터); 
                } 
            } 
            Log.i (TAG, sb.toString ()); 
        } 
    } 
}

3. 요청 권한은 캡슐화 도구를 반영하여 매개 변수 목록과 방법을 수행 할 수 있습니다

 

추천

출처www.cnblogs.com/kevinOnes1/p/11329706.html