Android运行时权限工具类

来源:互联网 发布:诺基亚n9deb的软件 编辑:程序博客网 时间:2024/06/05 18:58

不想下载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

0 0
原创粉丝点击