Android M App Permissions

来源:互联网 发布:java获取select的值 编辑:程序博客网 时间:2024/05/17 07:45

Android new app permissions model

Android M new app permissions model,其中重点是Runtime Permissions,本文
介绍新权限系统模型和描述Runtime Permissions的机制和注意事项。

    • 前言
    • 1为什么需要新的权限系统
    • 2新应用权限模型使用详解
      • 1新应用权限模型概述
        • 11声明权限
        • 12权限组
        • 13限制安装时授权
        • 14运行时授权
        • 15运行时需要一直检查权限
        • 16提示权限意图
        • 17撤回授权
      • 2打开新权限模型
      • 3定制Android M权限
      • 4权限组
      • 5运行时授权过程
        • 51检测设备系统版本
        • 52检测应用是否拥有权限
        • 53提示授权意图
        • 54请求权限
        • 55处理请求结果
      • 6Normal permissions授权问题
    • 3不要压垮用户
    • 4用ADB调试新权限模型
      • 1adb install
      • 2授权和撤销授权
    • 5Intent代替授权
    • 6例子

前言

Android M(Marshmallow,棉花糖),亦称Android 6.0,是Google在2015年 Google I/O大会上正式发布。Android M相比Android L有六项重大的改进,其中之一便是App Permissions(软件权限管理),即New permissions model,主要特征是在Android M以前的版本是安装时授权,Android M 是运行时授权。

1、为什么需要新的权限系统?

引用官方解析,新的权限系统能够给用户带来美好的感受,能让用户更加方便的安装应用和明确了解应用需要什么权限和做什么事情,令用户使用App更加舒适。
Android M系统的权限一直都是倍受争论的模块,因为Android的个性化程度非常高,包括App开发的权限也是在Manifest文件中申明便可拥有相应的权限,所以,安全性一直令人担忧。所以Android在安全问题不断的向前发展,包括之前的默认SMS app才能发送接收SMS message,到Android M 的新权限模型。

2、新应用权限模型使用详解

2.1、新应用权限模型概述

在新应用全新模型中怎么去开发App应用呢?主要有以下几点:

2.1.1、声明权限

和之前的把版本一样,需要在manifest文件中声明应用需
要的权限。

2.1.2、权限组

可以使用权限组代替单一的权限声明,也就是说权限组可
以代替两个或更多的单一权限。例如,联系人写权限和读权限,可以用联系人操作权限来代替。

2.1.3、限制安装时授权

在Android M以前的版本都是在App安装时给应用授权,Android M也有安装时授权,不过只有normal permissions可以在安装时授权,其它权限需要在运行时授权。

2.1.4、运行时授权

非normal permission在App运行时向system请求相应的权限,这点就是new app permissions和老版本的最大不同点。

2.1.5、运行时需要一直检查权限

在应用需要用某权限的功能之前,都需要检查应用当前是否具有该权限。

2.1.6、提示权限意图

在Android M中,如果应用没有顺利获取到使用某功能的权
限,可以向用户提示应用需要使用什么权限去做什么事情。

2.1.7、撤回授权

在新应用权限模型中用户可以更加方便的管理应用的权限,
即户可以在设置里面对应用的权限进行集中管理,关闭或打开。

2.2、打开新权限模型

Android为了保持向下兼容,Android需要保证M版本SDK编译的App能够在M和M以前的版本中正常运行,需要保证M以前的版本的SDK编译的App能够在M和M以前的版本中正常运行。也就是说,目前只有在特定的条件下,新权限模型才会起作用。要打开该模型,需要设置targetSdkVersion为Android 6.0,设置compile-SdkVersion为SDK 23。

2.3、定制Android M权限

在M以前的版本中,都是在安装时授权,所以在App安装时会列出应用在manifest文件中定义的所有的权限,而M需要在运行时授权,所以在安装App时不提示权限。在M以前的版本中用标签声明权限,所以在M之前版本中,如果App安装时不需要提示用户应用需要的权限,则用标签来声明权限。标签在M中效果和一样。

2.4、权限组

使用权限组可以减少授权操作。例如,发送短信需要请求android.permission.SEND_SMS权限,接收短信需要请求android.permission.RECEIVE_SMS权限,这个时候就需要进行两次授权,所以,在这里,App就可以用权限组来代替,上面两个权限可以用android.permission-group.SMS来代替。Android 中的权限组如下:

这里写图片描述
这里写图片描述

2.5、运行时授权过程

2.5.1、检测设备系统版本

因为运行时授权仅有在M版本时才需要,所以是否启动权限请求前,应该判断当前用户设备的Android版本,如果是M版本则请求权限,如果是M以前的版本或M以前的版本编译的App,则不需要请求权限。Android M的target号是MNC,所以,代码中可以用Build.VERSION.CODENAME来获取编译版本号,Android M的CODENAME便是MNC。Build.VERSION.RELEASE获取设备Android版本号,M便是6.0,或获取targetSdk,Build.VERSION.¬SDK_INT,M便是23.

2.5.2、检测应用是否拥有权限

在请求前需要检测某权限在以前是否已经被用户授权,如果用户已经授权过,则不需要重新请求权限,如果用户没有授权过,则需要请求该权限。检测是否拥有该权限,可以Context.check¬SelfPermission(permission_name)方法来判断。但是该方法是在api 23中添加的,所以在minSdkVersion <23中使用是会报错的。为了兼容底版本,Android一向解决方法便是增量包,所以,可以通过v4包的PermissionChecker.checkSelfPermission()方法或ContextCompat.checkSelfPermission()方法来判断。

2.5.3、提示授权意图

提示用户授权意图,即提示用户App需要什么权限,App去干什么事情,令用户知道App所获取权限的目的和安全性,以便用户可以更好理解或管理相应的权限,以达到提高用户体验的目。Android M平台可以用Activity.shouldShowRequestPermission¬Rationale(String)来判断,M以前的则需要使用Activity¬Compat.should¬ShowRequest-PermissionRationale()。该方法在用户拒接过授权时才会返回true。

2.5.4、请求权限

Activity.requestPermissions(String[], int)方法来请求。调用该方法后,便系统便会弹出授权的dialog。参数String[]可以让App同时请求多个权限。

2.5.5、处理请求结果

在2.5.4后,当用户操作完毕,便会回调结果到App,App需要复写onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)方法,在该方法中可以处理用户授权的结果。

2.6、Normal permissions授权问题

所谓normal permissions,是相对危险权限来说,所有normal permissions都不需要通过运行时授权,也就是说normal permissions在App安装时系统便给App授权,不需要用户授权。所以,normal permissions和M以前的版本一样,在manifest中声明即可拥有该权限。Android中normal permissions包括如下图2-图3:

这里写图片描述
这里写图片描述

3、不要压垮用户

不要压垮用户,其实就是App不应该在同一时间申请所有的权限,例如一个App需要20个权限,在打开App时全部请求用户授权,那么用户可能就把应用强退了。所以,运行时授权应该在需要时再请求。

4、用ADB调试新权限模型

4.1、adb install

用adb install新的-g参数,可以在安装应用时全部授权manifest中的权限。如adb install -g 。

4.2、授权和撤销授权

用新的ADB package manager (pm)命令可以授权或撤销授权。如:授权:adbpmgrant adb pm revoke 。

5、Intent代替授权

有时有两种方式去实现一个任务,例如,App需要通过camera获取一张图片,App可以请求camera权限去调用camera的API去拍摄一张图片。但是,App也可以通过发送包含action 为ACTION_IMAGE_CAPTURE的Intent,启动camera,让camera去拍摄图片,App只需要在onActivityResult()中获取返回来的图片。
用第一种方式,App开发者需要熟悉camera API,开发者需要开发拍摄的UI,需要请求权限,所以要求比第二种要高。所以,必要的时候,可以用Intent代替运行时授权去完成任务。

6、例子

请求权限:
这里写图片描述

处理结果:

这里写图片描述

0 0