一. 前言

先上github地址:https://github.com/permissions-dispatcher/PermissionsDispatcher

Android开发中避不开的一个问题就是动态权限的申请,自己写很繁琐,这里介绍PermissionsDispatcher这个轮子。

PermissionsDispatcher提供基于注解的API来处理动态权限的申请,简单易用。

二. 用法

1. 在build.gradle中引入依赖以及jitpack

dependencies {
  implementation "org.permissionsdispatcher:permissionsdispatcher:${latest.version}"
  annotationProcessor "org.permissionsdispatcher:permissionsdispatcher-processor:${latest.version}"
}
repositories {
  maven {url"https://jitpack.io" }
  ...
}

2. 在AndroidManifest.xml中添加需要的权限

<!-- 例 -->
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.CALL_PHONE" />

3. 添加注解

Annotation Required Description
@RuntimePermissions Register anActivity or Fragment to handle permissions
@NeedsPermission Annotate a method which performs the action that requires one or more permissions
@OnShowRationale Annotate a method which explains why the permissions are needed. It passes in aPermissionRequest object which can be used to continue or abort the current permission request upon user input. If you don't specify any argument for the method compiler will generate process${NeedsPermissionMethodName}ProcessRequest and cancel${NeedsPermissionMethodName}ProcessRequest. You can use those methods in place of PermissionRequest(ex: with DialogFragment)
@OnPermissionDenied Annotate a method which is invoked if the user doesn't grant the permissions
@OnNeverAskAgain Annotate a method which is invoked if the user chose to have the device "never ask again" about a permission
3.1 @RuntimePermissions

此注解用在Activity或Fragment之上,用于处理权限,以给activity添加权限为例:

@RuntimePermissions
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    //其他代码省略
    //......
}
3.2 @NeedsPermission

此注解注释到用户已经授权的方法上,这个方法用于处理用户允许权限后的操作。

类似下面这样:

/**申请权限**/
    @NeedsPermission({Manifest.permission.READ_PHONE_STATE})
    void requestPhoneState() {
        LogUtil.i("=====允许授权=====");
        //获取设备号
        //......
    }
3.3 @OnShowRationale

一般注释在dialog上,当用户之前拒绝授权(未勾选不再询问),这次打开app点击执行需要授权的方法时的处理,而这个dialog用于解释当前操作需要申请什么权限。如:

/**弹授权框(第一次拒绝后,第二次打开弹出的授权框)**/
    @OnShowRationale({Manifest.permission.READ_PHONE_STATE})
    void showDialog(final PermissionRequest request){
        new AlertDialog.Builder(this)
                .setMessage("是否授权手机权限?")
                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        request.proceed();
                    }
                })
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        request.cancel();
                    }
                })
                .show();
    }
3.4 @OnPermissionDenied

注释在用户拒绝授权的方法上,而这个被注释的方法,用于处理用户拒绝授权后的操作.

用户拒绝授权后的操作,一般是做弹窗提示,或引导用户去设置

/**拒绝授权**/
    @OnPermissionDenied({Manifest.permission.READ_PHONE_STATE})
    void deniedPermission(){
        LogUtil.i("=====拒绝授权的处理=====");

        //弹框提示:需要授权
        //......
    }
3.5 @OnNeverAskAgain

注释一个方法,如果用户选择让设备“永远不要再问”有关权限时调用该方法

用户勾选过“不再询问”后测处理。一般处理与“拒绝授权”的处理相同。

/**不再询问**/
    @OnNeverAskAgain({Manifest.permission.READ_PHONE_STATE})
    void neverAskPermission(){
        LogUtil.i("=====不再询问的处理=====");

        //弹框提示:需要授权
        //......
    }

4. 请求单个权限以及多个权限的办法

此处内容需要评论回复后(审核通过)方可阅读。

最后修改:2020 年 08 月 22 日 10 : 26 AM
如果觉得我的文章对你有用,请随意赞赏