開發者技術變現資源聚集地
https://www.baiydu.com
android6.0以上某些權限需要動態申請,雖然現在大多的手機系統版本在6.0,但是升級到6.0及以上是遲早的事,所以如何能夠更好的控制動態申請權限時能有好的提示用戶,及給用戶帶去更好的體驗,是需要花點時間認真思考的,下面就將我的實現思路、代碼、視頻貼出,希望能幫助到看筆記的各位。
思路:
將需要動態申請的權限放入一個集合,在app啟動時,判斷 Build.VERSION.SDK_INT版本,當Build.VERSION.SDK_INT>22時,,遍歷請求權限集合里的每一個權限,判斷是否有未針對本App,沒有開啟的權限,定一個int全局變量,當前遍歷請求權限時,如果某一個遍歷權限未開啟,給int變量+1, 遍歷完畢,判斷int ,當int>1彈出一個提示框。

這里用戶如果點擊取消,定義定義一個單例模式里的字段,來記錄。比如我們這里請求的Manifest.permission.READ_PHONE_STATE權限被用戶拒絕了,那么你在接下去的代碼中就不能去獲取device_id,否則app直接崩。
如果用戶點擊了確定,我們調用一個方法,跳轉到權限設置頁面,讓用戶選擇開啟,跳轉之后,你ap片需要動態申請到的權限都在,權限開啟欄中。
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怎么辦
解決方法:
當用戶從上面授權截圖返回App時,我們再遍歷動態集合,看哪些未開啟,如果這時還有未開啟的權限,我們就不能再彈框了,那樣就會造成死循環,強行要求用戶開啟權限,這樣肯定是無法通過App商店審核的,而且用戶體驗也不好,這時我們就做一個記錄,之后別使用未申請的權限了, 以上的判斷在onResume里面,並且要單獨開一個線程否則報錯,而且需要定義一個中介全局變量,當用戶點擊確定時,設置一個值,以便用戶返回時通過這個值來判斷是否用戶是從權限申請頁里返回的!並且這時判斷到還有未開啟的權限時,我們可以有好的提示一下用戶:"Toast.makeText( LaunchActivity.this, "部分權限被拒絕獲取,將會會影響后續功能的使用,建議重新打開", Toast.LENGTH_LONG ).show()",然后再繼續執行代碼。
@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多萬,各種當前熱門的網絡手機獎勵紅包全部集成,另外還有熱門電影和淘寶高額優惠券!很適合各類型的用戶。

