android6.0以上某些權限須要動態申請,雖然如今大多的手機系統版本在6.0,可是升級到6.0及以上是早晚的事,因此如何可以更好的控制動態申請權限時能有好的提示用戶,及給用戶帶去更好的體驗,是須要花點時間認真思考的,下面就將個人實現思路、代碼、視頻貼出,但願能幫助到看筆記的各位。html
思路:java
將須要動態申請的權限放入一個集合,在app啓動時,判斷 Build.VERSION.SDK_INT版本,當Build.VERSION.SDK_INT>22時,,遍歷請求權限集合裏的每個權限,判斷是否有未針對本App,沒有開啓的權限,定一個int全局變量,當前遍歷請求權限時,若是某一個遍歷權限未開啓,給int變量+1, 遍歷完畢,判斷int ,當int>1彈出一個提示框。android
這裏用戶若是點擊取消,定義定義一個單例模式裏的字段,來記錄。好比咱們這裏請求的Manifest.permission.READ_PHONE_STATE權限被用戶拒絕了,那麼你在接下去的代碼中就不能去獲取device_id,不然app直接崩。網絡
若是用戶點擊了肯定,咱們調用一個方法,跳轉到權限設置頁面,讓用戶選擇開啓,跳轉以後,你ap片須要動態申請到的權限都在,權限開啓欄中。app
private void openAppPermissionSetting(int requestCode) { PrimmessIntent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + this.getPackageName())); PrimmessIntent.addCategory(Intent.CATEGORY_DEFAULT); builder=new AlertDialog.Builder(this); builder.setIcon( R.mipmap.temp_log); builder.setTitle("權限申請"); builder.setMessage("咱們須要申請一些權限,以便給你帶來更好的體驗!"); //監聽下方button點擊事件 builder.setPositiveButton("確 定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { try { startActivityForResult(PrimmessIntent, requestCode); PrimmessIntent=null; PrimmessOk=true; } catch (Throwable e) { } } }); builder.setNegativeButton("取 消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { PrimmessOk=false; Toast.makeText( LaunchActivity.this, "部分權限被拒絕獲取,將會影響後續功能的使用,建議從新打開", Toast.LENGTH_LONG ).show(); isorNoStopPrimmess=isorNoStopPrimmess+1; LastMethord(); } }); //設置對話框是可取消的 builder.setCancelable(true); AlertDialog dialog=builder.create(); dialog.show(); }
重要:下面這一點很重要了,就是用戶即便選擇了肯定,跳轉到權限設置裏面了,他未設置開啓權限,或則沒有徹底開啓怎麼辦,就返回了怎麼辦?
如上面的截圖他只開了兩個,其餘三個不開啓就返回了App怎麼辦ide
當用戶從上面受權截圖返回App時,咱們再遍歷動態集合,看哪些未開啓,若是這時還有未開啓的權限,咱們就不能再彈框了,那樣就會形成死循環,強行要求用戶開啓權限,這樣確定是沒法經過App商店審覈的,並且用戶體驗也很差,這時咱們就作一個記錄,以後別使用未申請的權限了, 以上的判斷在onResume裏面,而且要單獨開一個線程不然報錯,並且須要定義一箇中介全局變量,當用戶點擊肯定時,設置一個值,以便用戶返回時經過這個值來判斷是否用戶是從權限申請頁裏返回的!而且這時判斷到還有未開啓的權限時,咱們能夠有好的提示一下用戶:"Toast.makeText( LaunchActivity.this, "部分權限被拒絕獲取,將會會影響後續功能的使用,建議從新打開", Toast.LENGTH_LONG ).show()",而後再繼續執行代碼。post
@Override public void onResume() { // TODO Auto-generated method stub super.onResume(); isorNoStopPrimmess=0; if(PrimmessOk) { PrimmessOk=false; RunLoadAndJumpHandle.post(judgeOpenPrimmessRunble); } } //關閉輸入帳號窗口句柄 public Runnable judgeOpenPrimmessRunble = new Runnable() { public void run() { RunLoadAndJumpHandle.sendEmptyMessage(1); } } ; public Handler RunLoadAndJumpHandle = new Handler() { public void handleMessage(android.os.Message msg) { for (PermissionModel model : models) { if (PackageManager.PERMISSION_GRANTED != ContextCompat.checkSelfPermission(LaunchActivity.this, model.permission)) { if(ActivityCompat.shouldShowRequestPermissionRationale( LaunchActivity.this,model.permission )) { ActivityCompat.requestPermissions(LaunchActivity.this, new String[]{model.permission}, model.requestCode); } else { isorNoStopPrimmess= isorNoStopPrimmess+1; } } model=null; } if (isorNoStopPrimmess>0) { Toast.makeText( LaunchActivity.this, "部分權限被拒絕獲取,將會會影響後續功能的使用,建議從新打開", Toast.LENGTH_LONG ).show(); } //OpenApp(); LastMethord(); } }; }
內容講到這裏,基本上就完了,下面有一個視頻連接,有興趣的能夠去看下。須要完整代碼能夠加QQ:2819936788
<a href="https://v.qq.com/x/page/i0612llnhrl.html?ptag=qqbrowser">權限申請</a> 點擊觀看視頻。</p>
https://v.qq.com/x/page/i0612llnhrl.html?ptag=qqbrowser
本人創業作的一款androidApp, 下載量已經有2000多萬,各類當前熱門的網絡手機獎勵紅包所有集成,另外還有熱門電影和淘寶高額優惠券!很適合各種型的用戶。ui