從根本解決Android6.0許可權檢測問題 附demo
阿新 • • 發佈:2018-12-31
耐心讀完,理解許可權處理的關鍵點。最後附有原始碼~~
一、背景:
android6.0系統開啟了敏感許可權使用者授權功能。如果開發的APP中不新增許可權獲取申請,預設是不會彈框提示使用者授權的,如此以來系統預設禁止使用拍照、儲存等敏感許可權,如果開發者設定targetSdkVersion >=23而APP中直接呼叫拍照或儲存時就會導致崩潰。解決辦法targetSdkVersion <23或者程式碼中新增許可權檢測。
二、編寫目的:
目前網上查詢6.0系統許可權解決辦法雜亂無章,單單通過直接呼叫requestPermissions和checkSelfPermission無法根本解決。最關鍵的是需要判斷使用者拒絕授權並勾選“不再提示”的情況。特此編寫此文,避免大家把時間浪費在已有的輪子上。
三、問題分析:
6.0+系統預設禁止拍照、儲存等敏感許可權,需要開發者程式碼中做許可權檢測判斷處理。許可權狀態判斷處理有三種狀態:
1、許可權預設被禁止
2、許可權被使用者拒絕授權並勾選“不再提示”——勾選不再提示後呼叫checkSelfPermission方法後系統不會彈出授權提示框,所以這種情況下需要重點處理,也是核心點。手動彈框提示使用者實現功能需要該許可權。
3、許可權授權成功。
四、解決辦法:
//***********測試敏感許可權申請***************
private void requestMyPermission() {
String[] arr_permision = new String[]{
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA};
//根據列出的許可權分次獲取敏感許可權
EasyPermission.with(this).code(AppContants.REQUEST_CODE).permissions(arr_permision).request();
}
//必須複寫此處的回撥,否則無法獲取使用者授權結果
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
EasyPermission.handleResult(this, requestCode, permissions, grantResults);//處理許可權申請回調結果
}
//授權結果回撥
@Override
public void onBasicPermissionSuccess() {
Toast.makeText(this, "授權成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onBasicPermissionFailed() {
Toast.makeText(this, "授權失敗", Toast.LENGTH_SHORT).show();
}
@Override
public void onBasicPermissionFailedNeedRational() {
Toast.makeText(this, "授權失敗並被勾選不再提示,此時引導使用者去應用設定中手動授權", Toast.LENGTH_SHORT).show();
//最好以對話方塊形式引導
AlertDialog dialog = new AlertDialog.Builder(MainActivity.this).setTitle("請前往應用授權設定中新增授權").setPositiveButton("去授權", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", MainActivity.this.getPackageName(), null);
intent.setData(uri);
startActivityForResult(intent, 001);
}
}).setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
}).show();
}
/*********END 許可權申請***************/