运行时权限请求框架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
https://download.****.net/download/wen_haha/10525172
Github