专栏首页MelonTeam专栏Android动态权限

Android动态权限

导语: 随机聊需求中出现几个涉及权限的bug,所以对动态权限机制做了一个简单的整理。

概述

Android应用程序通过请求权限来访问设备数据,例如联系人,短信,SD卡,相机,蓝牙等。应用所需的权限需要在manifest文件中声明,在安装的时候由用户授予。 app安装后就获得了这些权限。运行时不再需要询问用户。

从Android 6.0(Api level 23)开始,引入了动态权限的机制,对权限进行了分类,根据权限的级别,危险权限不再是安装后自动授予,而是需要运行时由用户授予。 这种机制更好的保护了用户的隐私安全,但也给开发人员带来了额外的适配工作,旧版本正常运行的app到6.0以上机器可能会发生crash。

动态权限机制生效需要满足两个条件:

  • manifest 文件中的 targetSdkVersion >= 23
  • 运行的手机系统版本 >= 6.0

权限分类

(1)正常权限:

对用户隐私影响比较小的权限。这些权限在应用安装时授予,运行时不再询问用户。例如: 网络访问、WIFI状态、音量设置等。

(2)危险权限:

涉及用户敏感数据的权限。例如: 读取通讯录、读写存储器数据、获取用户位置等。如果需要使用这些危险权限,首先必须在配置文件中声明,同时在运行时检查是否拥有权限,如果没有需要请求用户授予。

权限组

Android系统对所有权限进行了分组,称为权限组 。属于同一组的危险权限将自动合并授予,用户授予应用某个危险权限,则应用将获得该权限组下的所有权限。

下表为危险权限及其分组:

动态申请权限

1. 检查权限

public int checkSelfPermission(String permission);

检查当前app是否拥有某权限。

  • 有权限: PackageManager.PERMISSION_GRANTED
  • 无权限: PackageManager.PERMISSION_DENIED

当应用需要用到某危险权限时,在执行权限相关代码前,需要使用该方法判断是否已经拥有该权限。有权限继续执行需要权限的代码;无权限则向用户请求授予权限。

2. 申请权限

void requestPermissions (Activity activity, String[] permissions, int requestCode);

当检测到应用没有指定的权限时,调用本方法向用户请求权限。调用此方法将弹出权限请求对话框询问用户 “允许” 或 “拒绝” 指定的权限。

  • 权限参数传入的可以是数组,调用该方法一次请求多个权限;
  • 传入的权限数组参数以单个具体权限为单位,但弹框询问用户授权时,属于同一权限组的权限将自动合并询问授权一次;
  • 请求的权限必须事先在 AndroidManifest.xml 中有声明,否则调用此方法请求时,将不弹框,而是直接返回“拒绝”的结果;
  • 第一次请求权限时,用户点击了“拒绝”,第二次再请求该权限时,对话框将出现“不再询问”复选框,如果用户勾选了“不再询问”并点击了“拒绝”,则之后再请求此权限组时将不弹框,而是直接返回“拒绝”的结果。

3. 处理权限请求的响应

调用requestPermissions请求权限后,在下面的回调中获取用户的选择结果。

public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults);

  • requestCode请求权限时传入的请求码,用于区别是哪一次请求的
  • permissions 所请求的所有权限的数组
  • grantResults 权限授予结果,和 permissions 数组参数中的权限对应, 值有两种:
    1. 授予: PackageManager.PERMISSION_GRANTED
    2. 拒绝: PackageManager.PERMISSION_DENIED

4. 提示用户授予权限的理由

boolean shouldShowRequestPermissionRationale (Activity activity, String permission)

判断是否有必要向用户解释为什么要这项权限。如果应用第一次请求过此权限,但是被用户拒绝了,则之后调用该方法将返回 true,此时就有必要向用户详细说明需要此权限的原因。

  • 如果应用第一次请求此权限时被用户拒绝,第二次再请求此权限时,用户勾选了权限请求对话框的“不再询问”,则此方法返回 false。
  • 如果设备规范禁止应用拥有该权限,此方法也返回 false。

版本兼容

由于以上几个方法都是在 Api level 23中才引入,如果需要运行在低版本中,需要做版本兼容。 support 包中有对应的兼容方法:

ContextCompat.checkSelfPermission() ActivityCompat.requestPermissions() ActivityCompat.shouldShowRequestPermissionRationale()

例子

这几个方法的使用比较简单,例子略,现在手Q android版的 targetSdkVersion=”9” 暂时还不涉及适配的工作。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 抠图技术初探

    图像抠图英文名叫 image matting,顾名思义就是将目标图像从背景中分离出来的一种图像处理技术。根据图像背景的复杂程度,一般分为纯色背景抠图(“绿幕”或...

    MelonTeam
  • 深度学习基础概念笔记

    导语 学习tensorflow,caffe等深度学习框架前,需要先了解一些基础概念。本文以笔记的形式记录了一个零基础的小白需要先了解的一些基础概念。 ...

    MelonTeam
  • 长短时记忆网络学习笔记

    aaa导语  一个机器学习算法包含两个主要部分  (1)模型从输入特征x预测输入y的函数f(x); (2)目标函数 目标函数取最小(最大)值时所对应的参数值,就...

    MelonTeam
  • 自制权限框架(二)注解

      上一篇中,咱们介绍了如何使用jsp自定义标签编写权限框架。在jsp中,权限标签内的内容,只有在用户拥有权限的时候,才能够正常的展示。

    小忽悠
  • Linux安全权限

    之前说了Linux文件的权限区分,这次来说一说Linux的安全权限,不知道权限划分的可以移步《Linux权限详解》

    无心的梦呓
  • mysql权限控制

    mysql权限控制 作为一名DBA,想必大家对MySQL中的权限都不陌生,MySQL中对于权限的控制分为三个层面:

    AsiaYe
  • SQL权限操作

    限制一个用户能够做什么事情,在MySQL中,可以设置全局权限,指定数据库权限,指定表权限,指定字段权限

    木瓜煲鸡脚
  • 【Unity游戏开发】Android6.0以上的动态权限申请问题

      最近公司的游戏在做安全性测试,期间也暴露出了不少安全上的问题。虽然我们今天要说的权限申请和安全性相关不大,但是也会影响到游戏的使用体验等,所以本篇博客中马三...

    马三小伙儿
  • Android动态权限申请(Kotlin版)

    Android6.0之后,APP有些用到的权限需要动态申请,虽然这个功能已经出来好久了,但一直没有研究过,只知道用法简单,到时候copy一下就好了,github...

    haifeiWu
  • 聊一聊Android 6.0的运行时权限

    Android 6.0,代号棉花糖,自发布伊始,其主要的特征运行时权限就很受关注。因为这一特征不仅改善了用户对于应用的使用体验,还使得应用开发者在实践开发中需要...

    技术小黑屋

扫码关注云+社区

领取腾讯云代金券