使用 PermissionsDispatcher 轻松解决 Android 权限问题

2,648 阅读2分钟
原文链接: www.jianshu.com

之前也处理过6.0后的权限问题,直接处理很是麻烦。这次在github上搜到了关于权限星数最多的PermissionsDispatcher这个库,几个注释完美解决权限问题。

第一步 添加各种注释

  1. @RuntimePermissions 注释在需要权限的Activity和Fragment

    @RuntimePermissions
    public class StudentChallengeActivity extends BaseActivity implements StudentChallengeContract.View {
  2. @NeedsPermission 注释在需要权限的方法上后面,需要传入所需的权限

     @NeedsPermission(Manifest.permission.RECORD_AUDIO)
     void startRecord(ImageView img) {
         long currentTime = Calendar.getInstance().getTimeInMillis();
         if (currentTime - lastClickTime < 500) {
             ShowToast("时间太短");
         }
         if (!isPress && currWord < adapter.getItemCount() - 1) {
             img.setImageResource(R.drawable.btn_recod_style2);
             isPress = true;
             //
             adapter.getItem(currWord).setWordColor(2);
             adapter.notifyDataSetChanged();
    
             //录音
             evalUtil2.beginRe(sentenceList.get(currWord).getEng());
         }
     }
  3. @OnShowRationale 注释在向用户解释为什么需要这个权限的方法上。

     @OnShowRationale(Manifest.permission.RECORD_AUDIO)
     void showRationaleForRecord(final PermissionRequest request){
         new AlertDialog.Builder(this)
                 .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();
                     }
                 })
                 .setCancelable(false)
                 .setMessage("挑战需要录音权限,应用将要申请录音权限")
                 .show();
     }

    这里必须要传个PermissionRequest参数。
    request.proceed(); 调出系统申请权限的弹窗会执行@NeedsPermissio对应的方法
    request.cancel(); 会执行@OnPermissionDenied对应的方法
    如果想直接调用系统的

  4. @OnPermissionDenied 被拒绝后调用的方法

     @OnPermissionDenied(Manifest.permission.RECORD_AUDIO)
     void showRecordDenied(){
         ShowToast("拒绝录音权限将无法进行挑战");
     }
  5. @OnNeverAskAgain 勾选了不再提示禁止后调用的方法

     @OnNeverAskAgain(Manifest.permission.RECORD_AUDIO)
     void onRecordNeverAskAgain() {
         new AlertDialog.Builder(this)
                 .setPositiveButton("好的", new DialogInterface.OnClickListener() {
                     @Override
                     public void onClick(DialogInterface dialog, int which) {
                         // TODO: 2016/11/10 打开系统设置权限
                         dialog.cancel();
                     }
                 })
                 .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                     @Override
                     public void onClick(DialogInterface dialog, int which) {
                         dialog.cancel();
                     }
                 })
                 .setCancelable(false)
                 .setMessage("您已经禁止了录音权限,是否现在去开启")
                 .show();
     }

第二步 make project一下


这个库会自动生成[Activity Name] + PermissionsDispatcher这样的一个类。当要调用使用权限的方法的时候,不直接调用我们直接添加了@NeedsPermission的方法,而是调用这个类生成的XXXWithCheck的方法。XXX就是添加了@NeedsPermission的方法名。

switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
                StudentChallengeActivityPermissionsDispatcher.startRecordWithCheck(StudentChallengeActivity.this,img);
    }

执行的流程

需要权限的地方执行[Activity Name]PermissionsDispatcher.XXXWithCheck()
然后调用@OnShowRationale注释的方法,方法里必传的参数PermissionRequest request

  • 执行request.proceed()调用系统申请权限的弹窗;
    如果在系统申请弹窗中勾选了不在提示并且拒绝,会调用@OnNeverAskAgain的方法
  • 执行request.cancel()会调用@OnPermissionDenied的方法

PermissionsDispatcher库的地址

github.com/hotchemi/Pe…