之前也處理過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的方法