1. 程式人生 > >執行時許可權請求框架PermissionsDispatcher

執行時許可權請求框架PermissionsDispatcher

概述

我們上一篇部落格講了Android6.0執行許可權,而Android給我們提供了很多執行時許可權請求框架的,我們這篇部落格就來講一下PermissionsDispatcher的使用。

PermissionsDispatcher是基於註解來寫的庫,原理就是你給你寫的方法加一個註解,然後在適當的時機呼叫這個被註解的方法。

整合方式

首先,我們需要在工程專案的build.gradle中新增:

dependencies {
    classpath 'com.android.tools.build:gradle:2.3.1'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
// NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files }

在app模組的build.gradle中新增如下程式碼:

apply plugin: 'android-apt'
dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2'
, { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support.constraint:constraint-layout:1.0.2' testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:26.0.0-alpha1' compile 'com.github.hotchemi:permissionsdispatcher:2.1.3' apt 'com.github.hotchemi:permissionsdispatcher-processor:2.1.3'
}

PermissionsDispatcher提供了五個註解,它們分別是:

1.RuntimePermissions必需的註解,它用來註冊一個Activity或者Fragment,使他們可以處理許可權

@RuntimePermissions
public class MainActivity extends AppCompatActivity {
}

2.NeedsPermission必需的註解,在需要獲取許可權的地方註釋,用來獲取許可權

單個許可權申請

@NeedsPermission(Manifest.permission.CALL_PHONE)
void siglePermission(){

}

多個許可權申請

@NeedsPermission({Manifest.permission.CALL_PHONE,Manifest.permission.WRITE_EXTERNAL_STORAGE})
void mulPermission(){

}

3.OnShowRationale提示使用者為何要開啟許可權。在使用者選擇拒絕後,再次需要訪問許可權時呼叫。這個註解的方法中要傳入一個PermissionRequest物件,這個物件有兩種方法:proceed()讓許可權請求繼續,cancel()讓請求中斷。

@OnShowRationale(Manifest.permission.CALL_PHONE)
//提示使用者為何要開啟許可權
void  showWhy(final PermissionRequest request){
    new AlertDialog.Builder(this).setMessage("請開啟打電話的許可權").setPositiveButton("確定", new DialogInterface.OnClickListener() {
        @Override
public void onClick(DialogInterface dialogInterface, int i) {
            request.proceed();//再次請求許可權
}
    }).setNegativeButton("取消", new DialogInterface.OnClickListener() {
        @Override
public void onClick(DialogInterface dialog, int which) {
            request.cancel();//取消執行請求
}
    }).show();
}

4.OnPermissionDenied使用者選擇拒絕時的提示

//OnPermissionDenied 使用者選擇拒絕時的提示
@OnPermissionDenied(Manifest.permission.CALL_PHONE)
void showDenied(){
    Toast.makeText(this, "您拒絕了此許可權", Toast.LENGTH_SHORT).show();
}

5.OnNeverAskAgain使用者選擇不再詢問後的提示

@OnNeverAskAgain(Manifest.permission.CALL_PHONE)
void showNotAsk(){
    new AlertDialog.Builder(this).setMessage("需要訪問電話的許可權,不開啟將無法使用!").setPositiveButton("確定", new DialogInterface.OnClickListener() {
        @Override
public void onClick(DialogInterface dialogInterface, int i) {
            Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
//設定去向意圖
Uri uri = Uri.fromParts("package", MainActivity.this.getPackageName(), null);
intent.setData(uri);
//發起跳轉
startActivity(intent);
}
    }).setNegativeButton("取消",null).show();
}

使用PermissionsDispatcher除了要實現註解之外,還要重寫Activity的onRequestPermissionsResult()方法,在裡面讓一個PermissionsDispatcher執行回撥。

PermissionsDispatcher是我們實現了@RuntimePermissions和@NeedsPermission這兩個必須的註解之後,再build一次project之後,編譯器就會在在app\build\intermediates\classes\debug目錄下與被註解的Activity同一個包。

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
MainActivityPermissionsDispatcher.onRequestPermissionsResult(this,requestCode,grantResults);
}

最後在呼叫輔助類中的方法就可以了,方法一般是@NeedsPermission註釋中的方法加上WithCheck即可。我在demo中@NeedsPermission註釋中的方法為call,所以我輔助類中的方法為:

MainActivityPermissionsDispatcher.callWithCheck(MainActivity.this);

外掛

在Android Studio中提供了了PermissionsDispatcher的外掛,我們只要在setting設定裡的plugins介面裡搜尋PermissionsDispatcher就可以安裝了,安裝完重啟一下就能使用:


在所需的Activity或者Fragment的程式碼裡面右鍵,選擇Generate,然後就可以選擇Generate Runtime Permissions…(生成動態許可權的生成)。


點選Generate Runtime Permissions…出現如下介面,輸入方法名字就能生成:


效果

這是我自己寫的一個小demo的效果


到此,PermissionsDispatcher框架就講解完了,大家應該可以使用PermissionsDispatcher框架來請求自己需要的許可權了。

Demo

Github