Android 6.0 动态权限申请

1. 概述

Android 6.0 (API 23) 之前应用的权限在安装时全部授予,运行时应用不再需要 询问用户。在 Android 6.0 或更高版本对权限进行了分类,对某些涉及到用户隐私 的权限需要在运行时根据用户的需要动态授予。这样用户就不需要在安装时被强迫同 意某些权限。

2. 正常权限和危险权限

Android 系统权限分为几个保护级别。需要了解的两个最重要保护级别是正常权 限和危险权限:

(1)正常权限:

涵盖应用需要访问其沙盒外部数据或资源,但对用户隐私或其他应用操作风险很小 的区域。这些权限在应用安装时授予,运行时不再询问用户。例如: 网络访问、WIFI 状态、音量设置等。完整的正常权限列表参考官网正常权限。

(2)危险权限:

涵盖应用需要涉及用户隐私信息的数据或资源,或者可能对用户存储的数据或其他 应用的操作产生影响的区域。例如: 读取通讯录、读写存储器数据、获取用户位置等。 如果应用声明需要这些危险权限,则必须在运行时明确告诉用户,让用户手动授予。

3. 权限组

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

危险权限(要动态申请)和权限组 列表如下:

权限组权限
CALENDAR
CAMERA
CONTACTS
LOCATION
MICROPHONE
PHONE
SENSORS
SMS
STORAGE

 

权限组和权限在 Android 代码中以字符串常量来表示,分别定义在以下两个 静态 内部类的字段中:

android.Manifest.permission_group(权限组): 
Manifest.permission_group.CALENDAR 
Manifest.permission_group.STORAGE
....
android.Manifest.permission(权限): 
Manifest.permission.READ_CALENDAR 
Manifest.permission.READ_EXTERNAL_STORAGE

4. 在运行时请求权限

设备系统是 Android 6.0 (API 23) 或更高版本,并且应用的 targetSdkVersion 是 23 或更高版本,则针对在 AndroidManifest.xml 中声明的危险权限,在运行时 还需要动态请求用户授权。动态权限请求相关操作的 API 封装在 android.support.v4 包中,发起请求权限的 Activity 需要直接或间接继承 android.support.v4.app.FragmentActivity。代码步骤中主要包含以下几个方法:

(1)检查权限

ContextCompat.checkSelfPermission(Context context, String permission)

返回值常量:

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

当应用需要用到危险权限时,在执行权限相关代码前,使用该方法判断是否拥有指 定的权限。

有权限,则继续执行设计需要权限的代码;无权限,则向用户请求授予权 限。

(2)解释权限

ActivityCompat.shouldShowRequestPermissionRationale(Activ ity activity, String permission)

判断是否有必要向用户解释为什么要这项权限。

  • 如果应用第一次请求过此权限,但 是被用户拒绝了,则之后调用该方法将返回 true,此时就有必要向用户详细说明需要 此权限的原因。
  • 如果应用第一次请求此权限时被用户拒绝,第二次再请求此权限时, 用户勾选了权限请求对话框的“不再询问”,则此方法返回 false。如果设备规范禁 止应用拥有该权限,此方法也返回 false。

(3)请求权限

ActivityCompat.requestPermissions(Activity activity, Strin g[] permissions, int requestCode)

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

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

第一次请求权限时,用户点击了“拒绝”,第二次再请求该权限时,对话框将出现 “不再询问”复选框,如果用户勾选了“不再询问”并点击了“拒绝”,则之后再请 求此权限组时将不弹框,而是直接返回“拒绝”的结果。

(4)处理结果

请求权限的结果返回和接收一个 Activity 的返回类似,重 写 FragmentActivity 或 Fragment 中的 onRequestPermissionsResult(...) 方法。

@Override
public void onRequestPermissionsResult(int requestCode, St ring permissions[], int[] grantResults) {
// 在此处理 }

5. 代码演示

功能如下:
 点击一个按钮,如果有相应权限就进行备份通讯录操作;
 如果没有相应的权限,则向用户申请权限;
 如果用户授权通过,则继续进行备份通讯录操作;
 如果用户拒绝授权,则弹出对话框引导用户跳转到应用权限管理界面手动授权。 部分文件代码:

1、首先在 AndroidManifest.xml 中声明权限

2、布局文件 activity_main.xm

3、 MainActivity

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值