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

stockwyz 7年前
   <p>之前也处理过6.0后的权限问题,直接处理很是麻烦。这次在github上搜到了关于权限星数最多的PermissionsDispatcher这个库,几个注释完美解决权限问题。</p>    <p><strong>第一步 添加各种注释</strong></p>    <ol>     <li> <p>@RuntimePermissions 注释在需要权限的Activity和Fragment</p> <pre>  <code class="language-java">@RuntimePermissions  public class StudentChallengeActivity extends BaseActivity implements StudentChallengeContract.View {</code></pre> </li>     <li> <p>@NeedsPermission 注释在需要权限的方法上后面,需要传入所需的权限</p> <pre>  <code class="language-java">@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());       }   }</code></pre> </li>     <li> <p>@OnShowRationale 注释在向用户解释为什么需要这个权限的方法上。</p> <pre>  <code class="language-java">@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();   }</code></pre> <p>这里必须要传个PermissionRequest参数。</p> <p>request.proceed(); 调出系统申请权限的弹窗会执行@NeedsPermissio对应的方法</p> <p>request.cancel(); 会执行@OnPermissionDenied对应的方法</p> <p>如果想直接调用系统的</p> </li>     <li> <p>@OnPermissionDenied 被拒绝后调用的方法</p> <pre>  <code class="language-java">@OnPermissionDenied(Manifest.permission.RECORD_AUDIO)   void showRecordDenied(){       ShowToast("拒绝录音权限将无法进行挑战");   }</code></pre> </li>     <li> <p>@OnNeverAskAgain 勾选了不再提示禁止后调用的方法</p> <pre>  <code class="language-java">@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();   }</code></pre> </li>    </ol>    <p><strong>第二步 make project一下</strong></p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/358b4eca1fe3f116e8fedd5f2a97fbfc.png"></p>    <p>这个库会自动生成[Activity Name] + PermissionsDispatcher这样的一个类。当要调用使用权限的方法的时候,不直接调用我们直接添加了@NeedsPermission的方法,而是调用这个类生成的XXXWithCheck的方法。XXX就是添加了@NeedsPermission的方法名。</p>    <pre>  <code class="language-java">switch (event.getAction()) {          case MotionEvent.ACTION_DOWN:                  StudentChallengeActivityPermissionsDispatcher.startRecordWithCheck(StudentChallengeActivity.this,img);      }</code></pre>    <h3><strong>执行的流程</strong></h3>    <p>需要权限的地方执行[Activity Name]PermissionsDispatcher.XXXWithCheck()</p>    <p>然后调用@OnShowRationale注释的方法,方法里必传的参数PermissionRequest request</p>    <ul>     <li>执行request.proceed()调用系统申请权限的弹窗;<br> 如果在系统申请弹窗中勾选了不在提示并且拒绝,会调用@OnNeverAskAgain的方法</li>     <li>执行request.cancel()会调用@OnPermissionDenied的方法</li>    </ul>    <h3> </h3>    <p> </p>