背景介绍
今天做读取联系人信息的时候,出现了一个问题
但是明明已经添加了读取联系*限,为什么还要让我添加权限,在网上查了一下,发现是因为权限问题。
系统权限主要分为两种,普通权限以及危险权限
普通权限:不会直接获取用户的隐私,如果manifest中声明了这些权限,系统会自动授予app这些普通权限。
危险权限:顾名思义,会获取用户隐私,如果你确实需要这些危险权限,用户必须在APP中,通过点击同意才能获取。(相机、位置、通讯录、短信等权限)
当用户手机的android系统为5.1及以下的系统,或者项目设置的targetSDK为22或者以下,那么所有的权限(普通和危险)都是在安装时候授权。但如果你的Android系统为6.0及以上并且targetSDK为23及以上,每一个危险的权限都必须在ap运行的时候逐一让用户点击同意或者拒绝。
所以我的程序崩溃的原因正好满足了以上三点:
1. TargetSdkVersion 为23以上
2. 手机的操作系统为6.0以上
3. 请求的是google定义的危险权限
解决办法是咋程序中检查是否授权,未授权则申请授权。
权限相关知识
其中,检查时候授权还有三种方式:
- ContextCompat.checkSelfPermission();被授权函数返回PERMISSION_GRANTED,否则返回PERMISSION_DENIED,在所有版本都是如此
- ActivityCompat.requestPermissions();这个方法在M(23)之前版本调用,onRequestPermissionResultCallback直接被调用,带着正确的PERMISSION_GRANTED或者RERMISSION_DENIED
- ActivityCompat.shouldShowRequestPermissionRationate();这个方法检查是否需要展示请求权限的提示,如果为false,不展示,true展示
1) 在M之前版本调用,永远返回false
2) 第一次请求权限时,返回false
3) 第一次请求权限被禁止,但未选择【不再提示】,返回true
4) 允许权限后,返回false
5) 禁止权限,并选择【不再提示】,返回false
另外:Fragment中也可以请求权限,效果和Activity一样。
FragmentCompat.requestPermissions()
FragmentCompat.shouldShowRequestPermissionRationate()
危险权限总结
参考博客
https://blog.csdn.net/njweiyukun/article/details/50044193?_t_t_t=0.6781663475894713
https://www.jianshu.com/p/e1ab1a179fbb
https://blog.csdn.net/wangpf2011/article/details/80589648