您的位置:首页 > 移动开发 > Android开发

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

2017-10-10 19:58 337 查看
之前也处理过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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐