使用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的方法