執行時許可權請求框架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