허가 만 요청이 포장을 구현하는 응용 프로그램을 실행할 수있는 권한을 요청하는 데 필요한 반사 기술 도구를 사용하여 패키지는 비즈니스 방법은 비 반사 호출 매개 변수 목록입니다.
참조 예 : 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. 요청 권한은 캡슐화 도구를 반영하여 매개 변수 목록과 방법을 수행 할 수 있습니다