パッケージを実装するための許可のための唯一の要求するアプリケーションを実行する許可を要求するために必要な反射技術ツールを使用してパッケージ、ビジネス方法は、非反射呼び出しパラメータリストです。
参考例: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日の午後03時56分 反射カプセル化ツールによって要求されたシステム*ランタイム権限のアンドロイド6.0バージョンよりも多くのための *デフォルトメインで呼ばれる反射このクラスのパラメータなしの.javaビジネスメソッドリスト * / パブリック クラス GetPermissionUtils 実装ActivityCompat.OnRequestPermissionsResultCallback { プライベートコンテキストコンテキスト、 プライベートアクティビティ活性; クラスclazz; // クラスオブジェクト、ユーザによって得られた受信パス 文字列パス; //はクラスパスcom.aaa.aContacts.Mainとして発呼者から渡された 文字列[] = {}パーミッション。 //は、一覧表示するための許可を申請する必要が int型のインデックス= 0; // 権限権限の配列インデックス値 のString methodNameの; // 活動は、ビジネス・メソッド名実行する準備ができて、実行に必要な許可を取得 する方法、方法、; // メソッド、オブジェクトを例は、活動のビジネスメソッドを取得するために実行されると プライベートContentResolverのリゾルバを、 プライベート 静的 決勝は int型 MY_CODE = 0; / ** *引数がありますコンストラクタ * @paramのコンテキストアプリケーションコンテキストオブジェクト * @paramの活動の現在の活動 * @paramの現在の活動の完全な名前com.aaa.aContacts.Mainパス * @paramの配列当局の権限が適用する必要があります * @paramのインデックスindex配列の特権位置 * @param methodNameのctivityは方法のビジネス名実行する準備ができて、実行に必要な許可を得た後、 * / 公共 GetPermissionUtils(コンテキストcontext、活動活動、文字列のパス、String []型の権限を、int型のインデックス文字列methodNameの){ この .context = 文脈; この.activity = 活性; この .path = パス。 この .permissions = パーミッション。 この .INDEX = インデックス。 この .methodName = methodNameの; 試す{ レゾルバ = context.getContentResolver()。 この .clazz = Class.forNameの(パス)。 方法 = clazz.getMethod(methodNameの、新しいクラス[] {})。 } キャッチ(例外e){ e.printStackTrace(); } } //要求許可:サービスの呼び出しの直接の方法がある場合、ない場合は、のために行く、現在の操作かどうか、必要な権限の活性を検出するために 、公共 のボイドのcheckPermission(){ int型コード= ActivityCompat.checkSelfPermission(文脈、権限[インデックス]); // アプリケーションが許可を含むか否かを検出する のiF(コード== PackageManager.PERMISSION_GRANTED){ // 実行するときに既に必要な権限を持って 試し{ Method.invoke(活性、新しい新しいオブジェクト[] {}); } キャッチ(例外E){ E. printStackTrace(); } } 他 { // 実行されていない必要な権限 requestRuntimePermissionを(); //実行に必要な権限を要求する場合 } } / ** ユーザーが見て、または許可を要求する権限付与するように指示された場合* * / 公共 ボイド requestRuntimePermissionを(){ // 実行するとき2019年8月9日午前16時04分09秒要求を必要とパーミッション IF (ActivityCompat.shouldShowRequestPermissionRationale(活動、権限[インデックス])){ Toast.makeText(context.getApplicationContext()、 "おめでとう、正常付与許可" 、Toast.LENGTH_LONG).SHOW(); } 他{ ActivityCompat.requestPermissions (活動、パーミッション、MY_CODE); } } @Override // 2019インディアン8越9 Riを午後4時01分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){ e.printStackTrace(); } } 他 { Toast.makeText(文脈、 "私はあなたが認可する同意しないごめんなさい" 、Toast.LENGTH_LONG).SHOW(); } } } }
2.活動Main.javaこのテストは、READ_CONTACTSはこの権限を要求し、あなたが本当に使用することができます。私たちは、シミュレータで連絡先を追加する必要がある、またはLogcatは、情報をログに記録したくありませんでした。
パッケージ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のリゾルバ。 プライベート 静的な 最終文字列タグ=「メイン」。 プライベート 静的 最終 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時01分48秒请求权限回调方法 公共 ボイド onRequestPermissionsResult(INT requestCode、文字列[]パーミッション、値int [] grantResults){ getPermissionUtils.onRequestPermissionsResult(requestCode、パーミッション、grantResults)を、 } 公共 ボイド読み出す(){ ウリURI = Uri.parse( "コンテンツ://com.android.contacts/contacts" )。 カーソルカーソル = resolver.queryを(URI、新しい文字列[] { "_ ID"}、NULL、NULL、NULL ); 一方、(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、新しい文字列[] { "MIMEタイプ"、 "DATA1"、 "DATA2"}、NULL、NULL、NULL ); 一方、(dataCursor.moveToNext()){ Stringデータ = dataCursor.getString(dataCursor.getColumnIndex( "DATA1"//文字列型= dataCursor.getString(dataCursor.getColumnIndex( "DATA2"))。 文字列型= 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.要求許可は、カプセル化ツールを反映したパラメータリストを持つ方法を実行することができます