現在要在android上獲取權限必須得動態申請,直接在manifest 申請是無效的,動態申請后的權限,就不用再次申請了。
但是在android 開發中用華為真機測試的時候,發現一個比較奇葩的問題,下面這一句代碼原本的作用是:
ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECORD_AUDIO)
1.如果應用之前請求過此權限但用戶拒絕了請求,此方法將返回 true
2.如果用戶在過去拒絕了權限請求,并在權限請求系統對話框中選擇了 Don’t ask again 選項,此方法將返回 false
原本的邏輯是先判斷這一個權限用戶是否默認禁止,
然后決定是否跳轉到設置頁面開啟權限,或者是直接詢問,獲取權限。
但是華為默認返回的是false,
所以第一次請求權限,和勾選了Don't ask again都會返回FALSE,你也就看不到勾選權限的對話框了,
所以這個方法就失效了,如果你以這個方式來判斷是否向系統請求權限就會有問題。
解決方式是先直接請求權限,
如果是之前沒有選擇Don,t ask again 就會打開系統自帶的權限請求dialog,
但是如果是勾選了don't ask again 則需要在 onRequestPermissionsResult 方法中,
當獲取權限失敗的時候調用這個方法,判斷用戶是否是禁止了獲取該項權限。
話講的不是太明白上個例子,權限開啟如下表:
中間涉及到一個問題,那就是系統默認拒絕了權限,這個你沒有辦法再去請求權限,我們只能說開一個自定義的對話框,讓用戶選擇是否去設置中心自己開啟權限。
/method 執行操作之前先判斷是否有權限,沒有就請求權限
int hasRecordPermission = ContextCompat.checkSelfPermission(context, Manifest.permission.RECORD_AUDIO);
if (hasRecordPermission == PackageManager.PERMISSION_GRANTED) {
//TODO
}else{
//如果被持續禁止開啟權限,需手動跳轉至設置界面開啟
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, CODE_REQUEST_RECORD_PERMISSION);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode == CODE_REQUEST_RECORD_PERMISSION) {
if (grantResults[0] == PackageManager.PERMISSION_DENIED) {//權限獲取失敗
Dialog record = new CommomDialog(this, R.style.dialog, "請開啟錄音權限", new CommomDialog.OnCloseListener() {
@Override
public void onClick(Dialog dialog, boolean confirm) {
if (confirm == true) {
//跳轉至設置中心
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivityForResult(intent, REQUEST_RECORD_PERMISSION_SETTING);//設置了requestcode 需要在OnActivityResult 中再次判斷是否勾選了所需權限
}
}
}).setNegativeButton("殘忍拒絕").setPositiveButton("去添加權限");
//用戶點了默認拒絕權限申請,這時候就得打開自定義dialog,讓用戶去設置里面開啟權限
if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECORD_AUDIO)) {
record.show();
} else {
Utils.toast("請開啟錄音權限");
}
}
}
}
///Override onActivityPermissionResult
if(resultCode == RESULT_CANCELED && requestCode == REQUEST_RECORD_PERMISSION_SETTING){
//從設置中心返回到APP得到的resultCode是RESULT_CANCELED
int hasRecordPermission = ContextCompat.checkSelfPermission(context, Manifest.permission.RECORD_AUDIO);
if (hasRecordPermission == PackageManager.PERMISSION_GRANTED) {
} else {
Utils.toast("權限被拒絕");
}
}