先直接看代碼:
1 public void onClick(View v){ 2 onCallPermission(); 3 } 4 5 public void onCallPermission(){ 6 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//判斷當前系統的SDK版本是否大于23 7 //如果當前申請的權限沒有授權 8 if (!(checkSelfPermission(Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED)){ 9 //第一次請求權限的時候返回false,第二次shouldShowRequestPermissionRationale返回true 10 //如果用戶選擇了“不再提醒”永遠返回false。 11 if (shouldShowRequestPermissionRationale(android.Manifest.permission.RECORD_AUDIO)){ 12 Toast.makeText(this, "Please grant the permission this time", Toast.LENGTH_LONG).show(); 13 } 14 //請求權限 15 requestPermissions(new String[]{Manifest.permission.RECORD_AUDIO},1); 16 }else {//已經授權了就走這條分支 17 Log.i("wei", "onClick granted"); 18 } 19 } 20 } 21 22 23 @Override 24 public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 25 if (requestCode==1){ 26 if (permissions[0].equals(Manifest.permission.RECORD_AUDIO)&&grantResults[0]==PackageManager.PERMISSION_GRANTED){ 27 listernUi();//得到權限之后去做的業務 28 }else {//沒有獲得到權限 29 Toast.makeText(this,"你不給權限我就不好干事了啦",Toast.LENGTH_SHORT).show(); 30 } 31 } 32 }
第一個方法:Button的點擊事件,點擊之后請求權限,然后走第二個方法。
第二個方法:請求權限,checkSelfPermission(Manifest.permission.RECORD_AUDIO)是檢查應用本身是否包含對應的權限,如果包含返回PackageManager.PERMISSION_GRANTED;
shouldShowRequestPermissionRationale :應用安裝后第一次訪問,直接返回false;第一次請求權限時,用戶拒絕了,下一次 shouldShowRequestPermissionRationale()返回 true,這時候可以顯示一些為什么需要這個權限的說明;第二次請求權限時,用戶拒絕了,并選擇了“不再提醒”的選項時:shouldShowRequestPermissionRationale()返回 false;
requestPermissions(new String[]{Manifest.permission.RECORD_AUDIO},1); :是請求對應的權限,會彈出一個對話框讓用戶選擇是否授權,用戶選擇之后會走 onRequestPermissionsResult這個回調方法
第三個方法:當用戶選擇之后進入該方法,授權處理之后的業務邏輯就寫在這個方法里面,(不建議直接把業務邏輯寫在requestPermission之后,寫在這個回調方法中更好),主要是先對requestCode進行判斷,看他對應的是哪個requestPermissions方法,然后判斷是否授權了。
文章列表