1. 程式人生 > >從根本解決Android6.0許可權檢測問題 附demo

從根本解決Android6.0許可權檢測問題 附demo

耐心讀完,理解許可權處理的關鍵點。最後附有原始碼~~
這裡寫圖片描述
一、背景:
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 許可權申請***************/