【威哥說】上文給大家講解了android運行時權限的使用,本文講解下當用戶勾選不再詢問后的權限該如何處理。
當第一次請求權限申請被拒絕后再進行第二次申請時,對話框中會多出一個 不再詢問 的復選框。如果勾選了該復選框并且拒絕請求,那么以后將無法再申請該權限。也就是說在調用 requestPermissions() 后,onRequestPermissionsResult() 會立刻被調用并且申請結果為 PERMISSION_DENIED 。 其實這個時候還是有一根救命稻草的。
判斷是否勾選不再詢問
首先需要判斷用戶是否勾選了不再詢問。
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case MY_PERMISSIONS_APPLY:
for (int i = 0; i < grantResults.length; i++) {
//判斷權限的結果,如果有被拒絕,就return
if (grantResults[i] == PackageManager.PERMISSION_DENIED){
if (!ActivityCompat.shouldShowRequestPermissionRationale(this,
permissions[i])){
showToast("點擊權限,并打開全部權限");
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivityForResult(intent, REQUEST_PERMISSION_SETTING);
}
ActivityCompat 位于 support.v7 包中,因為運行時權限是 6.0 的新特性,使用該類可以省略對版本的判斷當權限申請被拒絕并且shouldShowRequestPermissionRationale() 返回 false 就表示勾選了不再詢問。轉到設置界面現在我們唯一能做的就是跳轉到我們 App 的設置界面,讓用戶手動開啟權限了。
也就是這幾行代碼,上面已經貼出,方便大家參考:
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivityForResult(intent, REQUEST_PERMISSION_SETTING);
·當然,你也可以先彈出對話框詢問用戶是否要授予權限,然后再跳轉。
跳轉到設置界面調用的是 startActivityForResult() 而不是 startActivity() 。
在 onActivityResult() 中沒有必要對 resultCode 進行判斷,因為用戶只能通過返回鍵才能回到我們的 App 中,所以 resultCode 總是為 RESULT_CANCEL。
在 onActivityResult() 中還需要對權限進行判斷,因為用戶有可能沒有授權就返回了!