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

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

第一步 添加各种注释

  1. @RuntimePermissions 注释在需要权限的Activity和Fragment
@RuntimePermissions
public class StudentChallengeActivity extends BaseActivity implements StudentChallengeContract.View {
  1. @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());
        }
    }
  1. @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对应的方法
如果想直接调用系统的

  1. @OnPermissionDenied 被拒绝后调用的方法
    @OnPermissionDenied(Manifest.permission.RECORD_AUDIO)
    void showRecordDenied(){
        ShowToast("拒绝录音权限将无法进行挑战");
    }
  1. @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);
    }

最后还要复写下onRequestPermissionsResult这个方法,里面写上生成类的onRequestPermissionsResult,类似如下:

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        StudentChallengeActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
    }

执行的流程

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

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

PermissionsDispatcher库的地址

https://github.com/hotchemi/PermissionsDispatcher

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 调研一下Android 6.0临时运行权限 调研一下原理 概述 临时运行权限是Android 6.0所带来的变化,...
    grr1314阅读 4,132评论 1 0
  • 目前搭载android6.0以上版本系统手机占有量将近三分之一,具体如下图所示: 所以有必要将升级app的targ...
    flywfk阅读 8,301评论 0 4
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 11,730评论 0 17
  • 昨晚吵架了,话很难听,今天又当什么都没发生过。这样的“默契”很狗血,很虚伪,很可笑,可是再狗血再虚伪再可笑还要往前...
    七月紫苏阅读 2,425评论 0 0
  • 1.绿·趣——游西沙湿地公园 郁可欣 和煦阳光下,我抵达了崇明岛,进入西沙湿地公园,一幅绿意无边的画...
    听语堂阅读 5,824评论 1 9