zoukankan      html  css  js  c++  java
  • 使用PermissionsDispatcher轻松解决Android权限问题

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

    第一步 添加各种注释

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

    @RuntimePermissions
    public class StudentChallengeActivity extends BaseActivity implements StudentChallengeContract.View {

    2.@NeedsPermission 注释在需要权限的方法上后面,需要传入所需的权限

     1 @NeedsPermission(Manifest.permission.RECORD_AUDIO)
     2  void startRecord(ImageView img) {
     3      long currentTime = Calendar.getInstance().getTimeInMillis();
     4      if (currentTime - lastClickTime < 500) {
     5          ShowToast("时间太短");
     6      }
     7      if (!isPress && currWord < adapter.getItemCount() - 1) {
     8          img.setImageResource(R.drawable.btn_recod_style2);
     9          isPress = true;
    10          //
    11          adapter.getItem(currWord).setWordColor(2);
    12          adapter.notifyDataSetChanged();
    13 
    14          //录音
    15          evalUtil2.beginRe(sentenceList.get(currWord).getEng());
    16      }
    17  }

    3.@OnShowRationale 注释在向用户解释为什么需要这个权限的方法上。

     1 @OnShowRationale(Manifest.permission.RECORD_AUDIO)
     2  void showRationaleForRecord(final PermissionRequest request){
     3      new AlertDialog.Builder(this)
     4              .setPositiveButton("好的", new DialogInterface.OnClickListener() {
     5                  @Override
     6                  public void onClick(DialogInterface dialog, int which) {
     7                      request.proceed();
     8                  }
     9              })
    10              .setNegativeButton("不给", new DialogInterface.OnClickListener() {
    11                  @Override
    12                  public void onClick(DialogInterface dialog, int which) {
    13                      request.cancel();
    14                  }
    15              })
    16              .setCancelable(false)
    17              .setMessage("挑战需要录音权限,应用将要申请录音权限")
    18              .show();
    19  }

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

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

     @OnPermissionDenied(Manifest.permission.RECORD_AUDIO)
     void showRecordDenied(){
         ShowToast("拒绝录音权限将无法进行挑战");
     }

    5.@OnNeverAskAgain 勾选了不再提示禁止后调用的方法

     1 @OnNeverAskAgain(Manifest.permission.RECORD_AUDIO)
     2  void onRecordNeverAskAgain() {
     3      new AlertDialog.Builder(this)
     4              .setPositiveButton("好的", new DialogInterface.OnClickListener() {
     5                  @Override
     6                  public void onClick(DialogInterface dialog, int which) {
     7                      // TODO: 2016/11/10 打开系统设置权限
     8                      dialog.cancel();
     9                  }
    10              })
    11              .setNegativeButton("取消", new DialogInterface.OnClickListener() {
    12                  @Override
    13                  public void onClick(DialogInterface dialog, int which) {
    14                      dialog.cancel();
    15                  }
    16              })
    17              .setCancelable(false)
    18              .setMessage("您已经禁止了录音权限,是否现在去开启")
    19              .show();
    20  }

    第二步 make project一下


     

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

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

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

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

    执行的流程

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

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

    PermissionsDispatcher库的地址

    https://github.com/hotchemi/PermissionsDispatcher



  • 相关阅读:
    679 怎样杀死害虫?(对付一个系统最好的方式是“围城必阙”)
    678 "流浪地球"为什么是个好地方?(系统越复杂拥有好运气的机会也就越大)
    677 人类为什么会养猫?(做一件事理性的原因的背后往往还隐藏着自己都不曾发现的感性原因)
    职场人必知的三原则
    677 怎样当一个少数派?(越在意,越出众)
    675 为什么会有“黑天鹅”?(行为和对行为后果的负责与否决定了很多黑天鹅出现概率)
    不做特殊论者(没有所谓的理所当然,你所谓的成功很有可能只是因为运气)
    事实和观点(就事论事,事实有真假,观点无对错)
    一个程序员的价值观总结
    669 创新也是搞政治?(如何创新)
  • 原文地址:https://www.cnblogs.com/ganchuanpu/p/7647523.html
Copyright © 2011-2022 走看看