Android权限管理

版权声明:本文为 冬夏 原创文章,可以随意转载,但请注明出处。

我们知道,在Android 6.0之前,当我们的应用需要某项权限时,只要在 AndroidManifest.xml 中添加对应的权限就好了。安装应用的时候会列出所有应用要求的权限,只有同意了才能继续安装。这样做虽然比较简单,但是却有两个比较大的缺点:

  1. 安装时列出的权限通常比较多,用户往往没有仔细看就点了同意,这样就让应用获取了一些非必须的权限,并利用这些权限非法收集用户信息,这也是 Android 被大众所诟病的原因之一。
  2. 如果用户并不想赋予应用某些权限,那么应用就不能安装,这种交互逻辑影响了用户体验,因为有些权限并不是运行应用必须的,或者说没有该权限应用一样可以运行。

因此,从 Android 6.0 开始,Google 改变了 Android 的权限处理逻辑。大致逻辑如图所示:

从图中我们可以看出,Google把权限分成两类,具体为:

  1. Normal:普通的权限,如网络,获取时区等,具体普通权限的列表可以在网上找到。处理这些权限如同的方式Android 6.0之前一样,只要在 AndroidManifest.xml 中添加对应的权限就好了。
  2. Dangerous:危险的权限,如打电话,获取联系人,读写SD卡等,这些权限在Android 6.0 后在 AndroidManifest.xml 中设置是无效的,必须在运行的时候动态获取,因此也称为动态权限。但是要注意的是,所有危险权限中有两个特殊的权限,即悬浮框权限和运行修改系统设置权限,这两个权限不能动态获取,必须引导用户自己到设置界面进行设置才能生效。

因此在 Android 6.0 之后,安装应用程序时不会列出所有的权限了,而是在使用应用的过程中动态获取。用户没有授权一些非必要的权限也不会导致用户的崩溃。这样一来既提高了用户体验,也让用户的数据更加安全。但也同时带来了开发难度加大的缺点,我们来梳理一下动态权限的逻辑。

  1. 在需要某个危险权限的时候,需要首先判断是否已经获得了该权限,如果没有,则应该弹出对话框询问用户是否授权。
  2. 当用户拒绝授权的时候,应该判断该权限是否必须的,从而判断是退出程序还是继续运行。
  3. 当用户曾经拒绝过该权限时,还应该考虑是否向用户解释为什么需要该权限,以便让用户顺利授权。具体方法为shouldShowRequestPermissionRationale(String permission)。当第一次申请该权限时,返回false,当第二次及以上申请该权限时,返回true。若用户已经选择了不再提示,则返回false。
  4. 若用户选择了不再提示,则下次需要该权限时,应该提醒用户手动到设置界面进行设置,因为这个时候权限授权对话框将不再弹出。

注: 由于 Android 的开放性,各个厂家都对系统做了修改,在实际使用过程中发现,有些手机即使查询到某权限已经授权,但在使用过程中还是会发生错误。针对这种情况,可以先尝试用代码测试是否改权限真正授权了(申请联系人权限时尝试如写入一个测试联系人数据)。如果失败,则弹出对话框或引导用户进行授权。

冬夏 wechat
欢迎您扫一扫上面的二维码,关注我的个人公众号:Android从入门到精通
坚持原创技术分享,您的支持将鼓励我继续创作