Android 运行时权限

来源:互联网 发布:住建部bim大数据库 编辑:程序博客网 时间:2024/05/29 04:33

半年前换过手机之后,就发现许多软件在安装之后已经授权过的内容,实际使用的过程中,会再次向我询问权限。这几天在开发的过程中,也遇到了明明在AndroidManifest.xml文件中申请过权限了,可是程序依旧抛错,没有权限的问题。调查以后发现,Android在6.0系统中引用了运行时权限这个功能,从来更好的保护用户的安全和隐私。

Android将权限归为两类,一类是普通权限,一类是特殊权限。对于不会威胁到用户安全和隐私的普通权限,系统会自动帮我们进行授权,对于危险权限,必须用户授权。以下是危险权限:



比如,我们需要申请读写存储文件的权限,可以这么申请:

        String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE , Manifest.permission.READ_EXTERNAL_STORAGE};        List<String> mPermissionList = new ArrayList<String>();        for (int i = 0; i < permissions.length; i++) {            if (ContextCompat.checkSelfPermission(this, permissions[i]) != PackageManager.PERMISSION_GRANTED) {                mPermissionList.add(permissions[i]);            }        }        if (mPermissionList.isEmpty()) {            return;        }        String[] permissionArray = mPermissionList.toArray(new String[mPermissionList.size()]);        ActivityCompat.requestPermissions(this, permissionArray, 1);


如果申请的只有一个权限,也可以这么写:

        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, 1);        }


注意,ActivityCompat.requestPermissions方法中的第三个参数是请求码。

调用完毕之后,系统会弹出询问权限是否授权的dialog,无论统一还是拒绝都会调用onRequestPermissionsResult()方法,授权结果会封装在grantResults中。

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        switch (requestCode) {            case 1:                for (int i = 0; i < permissions.length; i++) {                    if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {                        //判断是否勾选禁止后不再询问                        boolean showRequestPermission = ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[i]);                        if (showRequestPermission) {                            ActivityCompat.requestPermissions(this, new String[]{permissions[i]}, 1);                        } else {                            // 如果用户在过去拒绝了权限请求,并在权限请求系统对话框中选择了 Don’t ask again 选项,此方法将返回 false。如果设备规范禁止应用具有该权限,此方法也会返回 false。                            Toast.makeText(this, "请前往设置开启权限", Toast.LENGTH_SHORT).show();                            return;                        }                    }                }                ......                break;            default:                break;        }    }

参考:第一行代码第2版

原创粉丝点击