运行时权限请求框架PermissionsDispatcher

概述android

咱们上一篇博客讲了Android6.0运行权限,而Android给咱们提供了不少运行时权限请求框架的,咱们这篇博客就来说一下PermissionsDispatcher的使用。git

PermissionsDispatcher是基于注解来写的库,原理就是你给你写的方法加一个注解,而后在适当的时机调用这个被注解的方法。
github

集成方式app

首先,咱们须要在工程项目的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中添加以下代码:ide

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提供了五个注解,它们分别是:
gradle

1.RuntimePermissions必需的注解,它用来注册一个Activity或者Fragment,使他们能够处理权限ui

@RuntimePermissions
public class MainActivity extends AppCompatActivity {
}

2.NeedsPermission必需的注解,在须要获取权限的地方注释,用来获取权限this

单个权限申请spa

@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.csdn.net/download/wen_haha/10525172

Github

https://github.com/kongkongdaren/PermissionsDispatcherDemo