Android 6.0动态权限

本文探讨了Android 6.0系统引入的动态权限管理,详细解析了权限的分类,包括常规权限和隐私权限,特别是隐私权限的动态申请流程。针对隐私权限,文章列举了其所属的权限组,并提供了代码示例来说明如何在运行时请求权限。最后,作者提到动态权限申请的繁琐性,并预告将封装一个动态权限库以简化开发工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

动态权限

Android M在2015年发布,6.0系统对于app权限设计跟之前的有了很大的变化.之前的系统在用户安装时提示一个应用需要的操作权限列表,用户同意权限之后就可以干任何事情了.6.0以后的系统对权限的使用有了更加严格的限制,每次使用到相关权限的时候就会弹出提示框让用户进选择.Android的这种权限设计对用户来说是更加安全的,作为开发者我们就不得不关注动态权限的申请.

权限分类

在6.0以后Android的权限可以分为两种:

常规权限

常规权限就是不涉及到用户隐私的权限,包括网络,蓝牙,NFC…,这种权限只需要在Manifest申请即可,应用安装的时候就授权了.

隐私权限

隐私权限就去读取或者修改用户的隐私数据,比如读取联系人,日历,短信,电话记录…..这种权限需要我们动态申请(targetSdkVersion>=23).

隐私权限的分类

隐私权限是以组(permission_group)的形式出现的,一共有9组,如下图:
这里写图片描述

注意:
    1.隐私权限同样需要在Manifest注册,否则回调给开发者权限会被拒绝
    2.在涉及到特殊权限操作时没有做动态权限的申请会导致App崩溃
    3.如果同一个权限组的任何一个权限被授权了,那么默认该权限组都被授权,比如读取联系人被授权了,那么Contact岁组的所有权限都被授权
    4.系统弹出的dialog的说明是对整个权限组进行说明而不是某个权限
    5.应用启动时,最好先请求应用必须的一些权限,非必须权限在使用的时候才请求,防止一次请求太多的权限或请求次数太多,用户可能对你的应用感到厌烦和抵触心理.
代码动态权限申请

上面介绍了动态权限,现在我们就来使用动态权限.
动态权限申请关注4个方法,变量:

  checkSelfPermission:检查是否授权了某些权限
  requestPermissions:请求权限
  onRequestPermissionsResult:用户选择的回调
  shouldShowRequestPermissionRationale:用户拒绝过这个权限了,应该提示用户,为什么需要这个权限
  PackageManager.PERMISSION_DENIED:拒绝
  PackageManager.PERMISSION_GRANTED:同意

代码调用

检查,请求权限,第一次拒绝后,第二次申请给出提示
if (Build.VERSION.SDK_INT >= 23) {
            int hasWriteContactsPermission = checkSelfPermission(Manifest.permission.CAMERA);
            if (hasPermission != PackageManager.PERMISSION_GRANTED) {
                if (shouldShowRequestPermissionRationale(Manifest.permission.CAMERA)) {
                    // 用户拒绝过这个权限了,应该提示用户,为什么需要这个权限。
                } 
            requestPermissions(
            new String[] { Manifest.permission.CAMERA },                REQUEST_CODE_ZXING_PERMISSIONS);
            } else {
        // 拥有该权限
            }
        }

用户选择回调
@Override
    public void onRequestPermissionsResult(int requestCode,
            String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == INTENT_REQUEST_CODE && grantResults[0] == 0) {
            // 权限通过
        }
    }

通过上面的学习,相信大家对动态权限有了更加深刻的认识了,但是感觉每次申请权限都要写这么多代码,感觉很麻烦,以后有时间封装一个动态权限库,敬请期待!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值