1. 程式人生 > >動態一次獲取多種android6.0以上的許可權

動態一次獲取多種android6.0以上的許可權

原文地址:https://blog.csdn.net/qq_27634797/article/details/76617334

    android6.0及以上版本區分了:普通許可權和危險許可權。普通許可權可以直接在清單檔案裡面申請,
    危險許可權不僅要在清單檔案裡面申請,還要在程式碼裡面動態獲取。如果你僅僅動態獲取了,
    沒有在清單檔案裡面申明,在你返回的回撥方法裡面會被拒絕給許可權。
    我這裡的思路就是,先判斷版本號是否大於android6.0,
    然後判斷你的操作需要的許可權哪些是沒有給的,沒有給的就去動態獲取,給了的就不用
    接著,彈出對話方塊提示使用者,需要這些許可權的原因,讓使用者去選擇,是否給該許可權
    最後,系統也會彈出一個對話方塊,讓使用者去確認,是否給許可權。
    注意:如果這裡,我們自己的對話方塊,使用者選擇了是,然後沒有彈系統的對話方塊讓使用者去選擇,
    就直接被拒絕了,那就是前面我說過的,在清單檔案裡面沒有註冊該許可權。
    這裡,我以拍照為例。呼叫方式如下:
 String[] permission = {Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE};//需要的許可權
        String title = "相機許可權不可用";
        String content = "由於上傳照片需要獲取相機相關許可權,獲取相簿功能;\n否則,您將無法正常使用相機功能";
        initPermission(permission,title,content);
    1、首先:判斷版本號是否大於android6.0for迴圈判斷哪些需要獲取的許可權
    /**
     * 初始化使用者許可權
     * @param permissions 需要的許可權
     * @param title 我們自己對話方塊的標題
     * @param content 我們自己對話方塊的內容
     */
    public void initPermission(String[] permissions, String title, String content) {
        // 版本判斷。當手機系統大於 23 時,才有必要去判斷許可權是否獲取
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            List<String> permissionList = new
ArrayList<>(); for (int i = 0; i < permissions.length; i++) {//for迴圈把需要授權的許可權都新增進來 if (ContextCompat.checkSelfPermission(context, permissions[i]) != PackageManager.PERMISSION_GRANTED) { //未授權就進行授權 permissionList.add(permissions[i]); } } //如果permissionList是空的,說明沒有許可權需要授權,什麼都不做,該幹嘛幹嘛,否則就發起授權請求 if (!permissionList.isEmpty()) { showDialogTipUserRequestPermission(permissionList, title, content); } } }
    2、彈出對話方塊,讓使用者選擇是否給許可權
// 提示使用者該請求許可權的彈出框
    private void showDialogTipUserRequestPermission(final List<String> permissionList, String title, String content) {
        new android.support.v7.app.AlertDialog.Builder(this)
                .setTitle(title)
                .setMessage(content)
                .setPositiveButton("立即開啟", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        startRequestPermission(permissionList);
                    }
                })
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        finish();
                    }
                }).setCancelable(false).show();
    }
    3、提交許可權的請求
// 開始提交請求許可權
    private void startRequestPermission(List<String> permissionList) {
        if (!permissionList.isEmpty()) {//不為空就進行授權申請
            String[] permissions = permissionList.toArray(new String[permissionList.size()]);
            ActivityCompat.requestPermissions(this, permissions, permissionsRequestCode);
        }
    }
    4、回撥方法
// 使用者許可權 申請 的回撥方法
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == permissionsRequestCode) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (grantResults.length > 0) {//安全寫法,如果小於0,肯定會出錯了
                    for (int i = 0; i < grantResults.length; i++) {
                        int grantResult = grantResults[i];
                        switch (grantResult){
                            case PackageManager.PERMISSION_GRANTED://同意授權0
                                break;
                            case PackageManager.PERMISSION_DENIED://拒絕授權-1
                                Utils.ShowToast(context,permissions[i]+"許可權獲取失敗");
                                finish();
                                break;
                        }
                    }
                }
            }
        }
    }
    這個回撥裡面的grantResults,就是該許可權返回的code碼。我這裡是一次獲取多個許可權,
    用的for迴圈,如果你只用申請一個,就不需要for迴圈,只用比較一次即可。
    demo就不用上傳了,把這裡的程式碼拷貝過去就可以直接用了。放到你的基類裡面。
    需要的時候呼叫就可以了。