Android 运行时权限

半年前换过手机之后,就发现许多软件在安装之后已经授权过的内容,实际使用的过程中,会再次向我询问权限。这几天在开发的过程中,也遇到了明明在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版

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值