Android

背景介绍

今天做读取联系人信息的时候,出现了一个问题

但是明明已经添加了读取联系人权限,为什么还要让我添加权限,在网上查了一下,发现是因为权限问题。

系统权限主要分为两种,普通权限以及危险权限

普通权限:不会直接获取用户的隐私,如果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

原文地址:https://www.cnblogs.com/Ayinger/p/10968658.html