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

Github

https://github.com/kongkongdaren/PermissionsDispatcherDemo

猜你喜欢

转载自blog.csdn.net/wen_haha/article/details/80941499