使用PermissionsDispatcher輕松解決Android權限問題
之前也處理過6.0后的權限問題,直接處理很是麻煩。這次在github上搜到了關于權限星數最多的PermissionsDispatcher這個庫,幾個注釋完美解決權限問題。
第一步 添加各種注釋
-
@RuntimePermissions 注釋在需要權限的Activity和Fragment
@RuntimePermissions public class StudentChallengeActivity extends BaseActivity implements StudentChallengeContract.View {
-
@NeedsPermission 注釋在需要權限的方法上后面,需要傳入所需的權限
@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()); } }
-
@OnShowRationale 注釋在向用戶解釋為什么需要這個權限的方法上。
@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(); }
這里必須要傳個PermissionRequest參數。
request.proceed(); 調出系統申請權限的彈窗會執行@NeedsPermissio對應的方法
request.cancel(); 會執行@OnPermissionDenied對應的方法
如果想直接調用系統的
-
@OnPermissionDenied 被拒絕后調用的方法
@OnPermissionDenied(Manifest.permission.RECORD_AUDIO) void showRecordDenied(){ ShowToast("拒絕錄音權限將無法進行挑戰"); }
-
@OnNeverAskAgain 勾選了不再提示禁止后調用的方法
@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(); }
第二步 make project一下
這個庫會自動生成[Activity Name] + PermissionsDispatcher這樣的一個類。當要調用使用權限的方法的時候,不直接調用我們直接添加了@NeedsPermission的方法,而是調用這個類生成的XXXWithCheck的方法。XXX就是添加了@NeedsPermission的方法名。
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
StudentChallengeActivityPermissionsDispatcher.startRecordWithCheck(StudentChallengeActivity.this,img);
}
執行的流程
需要權限的地方執行[Activity Name]PermissionsDispatcher.XXXWithCheck()
然后調用@OnShowRationale注釋的方法,方法里必傳的參數PermissionRequest request
- 執行request.proceed()調用系統申請權限的彈窗;
如果在系統申請彈窗中勾選了不在提示并且拒絕,會調用@OnNeverAskAgain的方法 - 執行request.cancel()會調用@OnPermissionDenied的方法
本文由用戶 stockwyz 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!