Android6.0运行时权限学习见解

在Android6.0之前,权限全部在manifest.xml文件中申请,这样容易导致一些问题,要同意就只能全部同意,要不然只能拒绝安装app,这样容易造成“店大欺客”的现象。所以,在android6.0之后加入了运行时权限,即在运行中需要用到权限时申请权限,而不是在安装app的过程中把所有的权限全部申请

Android官方呢把权限分为两种,一个是普通权限,一种是危险权限。授权机制是这样的。如果你申请某个危险的权限,假设你的app早已被用户授权了同一组的某个危险权限,那么系统会立即授权,而不需要用户去点击授权。比如你的app对READ_CONTACTS已经授权了,当你的app申请WRITE_CONTACTS时,系统会直接授权通过。此外,对于申请时弹出的dialog上面的文本说明也是对整个权限组的说明,而不是单个权限(ps:这个dialog是不能进行定制的)。

那么接下来就是如何进行申请运行时权限。
首先如果应用中需要用到危险权限的时候,targetSdkVersion大于等于23的时候,在AS中会直接报错,这时候提示需要进行权限检查,检查的代码如下:

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

} else {
     call();
}

ActivityCompat.checkSelfPermission()这个代码就是检查权限的代码,传入两个参数,第一个是context对象,第二个就是要使用的权限。会返回两个值:
1 PackageManager.PERMISSION_GRANTED (权限已经申请)
2 PackageManager.PERMISSION_DENIED(权限未申请)
当检查到权限未申请的时候,ActivityCompat.requestPermissions()这个方法可以申请权限,此时会弹出一个对话框提醒用户是否授予权限,里面需要三个参数,第一个是context对象,第二个是个字符串数组,可以批量的申请所需要的权限,第三个是申请权限的申请码,这里是自定义,只要唯一就可以。它类似于startActivityForResult()这个方法,当申请了权限之后,会回调onRequestPermissionsResult()这个方法:

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {


    }

需要说明的是,第一个参数是请求码,就是之前申请权限时你填写的数字,第二个参数是字符串就是你申请权限的字符串数组,第三个是结果数组
这里的数组对应于申请时的第二个权限字符串数组。如果你同时申请两个权限,那么grantResults的length就为2,分别记录你两个权限的申请结果。如果申请成功,就可以做你的事情了:

    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {  
                //这里写申请权限通过后的代码
} else {
        //这里写申请权限拒绝后的代码
 }

这就是申请动态权限的全部流程

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值