使用PermissionsDispatcher輕松解決Android權限問題

stockwyz 8年前發布 | 40K 次閱讀 安卓開發 Android Studio開發工具

之前也處理過6.0后的權限問題,直接處理很是麻煩。這次在github上搜到了關于權限星數最多的PermissionsDispatcher這個庫,幾個注釋完美解決權限問題。

第一步 添加各種注釋

  1. @RuntimePermissions 注釋在需要權限的Activity和Fragment

    @RuntimePermissions
    public class StudentChallengeActivity extends BaseActivity implements StudentChallengeContract.View {
  2. @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());
         }
     }
  3. @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對應的方法

    如果想直接調用系統的

  4. @OnPermissionDenied 被拒絕后調用的方法

    @OnPermissionDenied(Manifest.permission.RECORD_AUDIO)
     void showRecordDenied(){
         ShowToast("拒絕錄音權限將無法進行挑戰");
     }
  5. @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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!