Android運行時權限工具類

不想下載demo的直接複製文中代碼就可以用了
demo地址:http://download.csdn.net/detail/bnm52007/9801104
爲了減少重複代碼,就把請求權限方法全部放在activity的基類裏了,如果你不想放在基類裏也可以直接把本demo的方法複製出來單獨用。

此demo抽去了一個BaseActivity,請求權限時只需要傳入(“要請求的權限(多個權限就傳數組)”,requestCode,”用戶拒絕時提示的內容”)

         MainActivity.super.Requestpermission(Manifest.permission.ACCESS_COARSE_LOCATION,99,"需要位置權限才能使用");

請求權限

用戶拒絕提示,點設置可以直接去開啓權限

注意事項
如果targetSdkVersion 25 小於23那一開始默認安裝APP就會獲得權限
demo拒絕授權提示對話框使用的時默認樣式如果你的和demo的不同是因爲activity的主題不同,請在清單文件修改。
一般請求權限流程:

在清單文件加上要請求的權限,activity繼承OnRequestPermissionsResultCallback,重寫onRequestPermissionsResult方法,判斷是否請求成功

1、判斷是否大於或等於23
2、判斷是否已經有權限了
3、有就直接使用,沒有就去請求
一次請求多個權限時,遍歷數組看那權限沒有就去請求那個,不重複請求以具備的權限

    //單個權限請求檢測,true不需要請求權限,false需要請求權限
    public boolean isPermissionGranted(String permissionName) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            return true;
        }
        //判斷是否需要請求允許權限
        int hasPermision = checkSelfPermission(permissionName);
        if (hasPermision != PackageManager.PERMISSION_GRANTED) {
            return false;
        }
        return true;
    }
    //多個權限請求檢測,返回list,如果list.size爲空說明權限全部有了不需要請求,否則請求沒有的
    public List<String> isPermissionsAllGranted(String[] permArray) {
        List<String> list = new ArrayList<>();
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            return list;
        }
        for (int i = 0; permArray != null && i < permArray.length; i++) {
         //獲得批量請求但被禁止的權限列表
            if (PackageManager.PERMISSION_GRANTED != checkSelfPermission(permArray[i])) {
                list.add(permArray[i]);
            }
        }

        return list;
    }
//單個權限請求
protected void Requestpermission(String s, int requestCode, String defeat) {
        hint = defeat;
        if (!TextUtils.isEmpty(s)) {
            boolean granted = isPermissionGranted(s);
            if (granted) {  //有權限,調用方法
                okPermissionResult(requestCode);
            } else {
                requestPermissions(new String[]{s}, requestCode);
            }
        }

    }

    //多個權限請求
    protected void Requestpermission(String s[], int requestCode, String defeat) {
        hint = defeat;
        if (s.length != 0) {
            List<String> perList = isPermissionsAllGranted(s);
            if (perList.size() == 0) {  //有權限,調用方法
                okPermissionResult(requestCode);
            } else {
                requestPermissions(perList.toArray(new String[perList.size()]), requestCode);
            }
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        for (int i : grantResults) {
            if (i != PackageManager.PERMISSION_GRANTED) { //有權限未通過
                popAlterDialog();
                return;
            }
        }
        okPermissionResult(requestCode);
    }

    //有權限調用
    protected void okPermissionResult(int requestCode) {

    }

    public void popAlterDialog() {
        new AlertDialog.Builder(this)
                .setTitle("提示")
                .setMessage(hint)
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                })
                .setPositiveButton("設置", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        //前往應用詳情界面
                        try {
                            Uri packUri = Uri.parse("package:" + getPackageName());
                            Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packUri);
                            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            startActivity(intent);
                        } catch (Exception e) {
                            Toast.makeText(BaseActivity.this, "跳轉失敗", Toast.LENGTH_SHORT).show();
                        }
                        dialog.dismiss();
                    }
                }).create().show();
    }

使用方法

 //定位,單個權限請求
        findViewById(R.id.tv_location).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //參數說明:權限字符串,請求標記碼(requestCode),用戶拒絕權限提示內容
                MainActivity.super.Requestpermission(Manifest.permission.ACCESS_COARSE_LOCATION,99,"需要位置權限才能使用");
            }
        });

        //多個權限請求
        findViewById(R.id.tv_allpeimission).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //參數說明:要請求的權限數組,請求標記碼(requestCode),用戶拒絕權限提示內容
                String[] perms = {
                        Manifest.permission.CAMERA
                        , Manifest.permission.RECORD_AUDIO
                        , Manifest.permission.READ_EXTERNAL_STORAGE};
                MainActivity.super.Requestpermission(perms,102,"需要相機,麥克風,存儲權限");
            }
        });
    @Override
    protected void okPermissionResult(int requestCode) {
        if (requestCode==99){
            Toast.makeText(this,"有位置權限了",Toast.LENGTH_SHORT).show();
        }else if (requestCode==102){
            Toast.makeText(this,"有相機,麥克風,存儲權限了",Toast.LENGTH_SHORT).show();
        }
    }

下載demo

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章