android动态权限到自定义权限框架
大家都知道android版本6.0(M)以后需要动态申请权限,今天我们就讲解下关于这块的知识点,然后用我们之前学的注解知识,写一个略微装逼的自定义框架,这篇先科普下基本知识
其实关于动态权限申请,androidM以后将权限划分出来一个危险权限,比如拍照啊录音等,你没啥事申请这些想干嘛?所以就让用户自己去管理是否同意。
6.0的时候某个应用在其清单中列出 READ_EXTERNAL_STORAGE 和WRITE_EXTERNAL_STORAGE。应用请求 READ_EXTERNAL_STORAGE,并且用户授予了该权限。如果该应用针对的是 API 级别 24 或更低级别,系统还会同时授予 WRITE_EXTERNAL_STORAGE,因为该权限也属于同一 STORAGE 权限组并且也在清单中注册过。如果该应用针对的是 Android 8.0,则系统此时仅会授予 READ_EXTERNAL_STORAGE;不过,如果该应用后来又请求 WRITE_EXTERNAL_STORAGE,则系统会立即授予该权限,而不会提示用户。
可以说是8.0的一次改变,当然对用户感知是没啥的。
我们列举下危险权限有哪些,允许我偷张图,可见权限还是分组的
权限列表
可以看出来,这些权限直接关系我们的隐私。
那么我们动态权限申请第一步该做什么呢?
在AndroidManifest.xml配置需要的权限,因为不写,只要申请肯定崩溃
第二步呢?肯定是android 版本判断啦,如果是低于23肯定就不用动态申请了
判断系统版本
以前有个骚操作就是把 targetSdkVersion改成低于23的 ,这样就不需要做6.0权限配置
但是随着谷歌的强行限定现在慢慢的版本都推到26以上了,所以还是别这么做了
写上我们需要申请的权限
需要申请的权限
检测是否拥有权限
PERMISSION_GRANTED代表申请到了权限,PERMISSION_DENIED代表还木有
如果当前还没有申请到权限,那我们就要使用
ActivityCompat.requestPermissions,需要传三个参数,第一个是Context,第二个是申请权限的数组,第三个是申请权限的code。
申请权限完成,我们要知道我们申请成功了么
覆盖onRequestPermissionsResult 方法
我们发现permissions和grantResults都是数组,如果我们在申请多个权限的时候,返回的数据就会是多个,和后面的grantResults一一对应,我们就知道哪个权限申请成功,哪个失败,方便我们再次申请
我们这里只申请了一个,先来测试一下,成功和失败是怎么对应的
先测试失败的
测试成功的
是不是和我们之前的PERMISSION_GRANTED和PERMISSION_DENIED对应起来了?
大家是不是见过这种选项,一旦勾选拒绝了,我们该怎么办?
我们看下拒绝后我们再次申请权限,发现不会出来弹窗了,这咋办
这个时候我们发现其实我们还是能收到回调,但是弹窗出不来罢了
我们引入下一个方法
ActivityCompat.shouldShowRequestPermissionRationale
需要传入俩参数 1Conctex,2申请的权限,返回boolean值
我们看看这个布尔值的返回情况
第一次拒绝权限申请
第二次同意权限申请
第三次拒绝加上勾选不提示
我们总结出来个啥子呢
申请失败的时候,我们在还能再次弹出的时候,返回值是true,申请成功就不会再弹出了,申请失败,勾选直接返回false,所以当申请失败,不能弹出的时候,我们就可以认为被勾选了不在提示,那么我们可以提示用户,您拒绝了我们的权限申请,请到设置里面打开,不然就无法使用XX功能。
利用权限申请被拒绝的时候,我们也可以弹出一个弹窗告诉用户,我们为什么需要这个权限,然后可以引导用户主动申请权限。
总结一下 动态申请权限的几大步骤
- AndroidManifest加入需要申请的危险权限,具体可以参考上面图表
- 检查版本是不是大于M,android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
- 检查是否已经拥有我们申请的权限了?ActivityCompat.checkSelfPermission();
- 如果没有,我们去申请权限。 ActivityCompat.requestPermissions();
- 覆盖onRequestPermissionsResult,根据requestCode,permissions,grantResults判断我们是否申请成功
-
失败的时候去利用ActivityCompat.shouldShowRequestPermissionRationale检查我们是不是被勾选了
禁止再询问选项
到此为止 最基本的权限申请套路我们学会了,下一步我们将参考现在比较流行的注解权限框架进行一个框架编写。