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

PermissionsDispatcher庫的地址

https://github.com/hotchemi/PermissionsDispatcher




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM