Android6.0运行时权限简介

Android6.0发布距离现在快2年多了,虽然它市场占有率仍在龟速上升中,但还是有一些App开发者已经在打包应用时将targetSDKVersion设置到了23,也就是说把App适配到了Android6.0。以前调用Android系统中需要声明权限的API时,只需要在AndroidManifest.xml文件中一次性列出来。但是如果在build.gradle文件里将targetSDKVersion设为23以后,除了在AndroidManifest.xml声明,我们还需要根据App运行时所在的手机的系统版本,在调用权限之前向用户申请授权,并在用户允许以后,才可以安全的调用对应的API。

简单举个例子,我的App有一个地理位置读取的功能,需要ACCESS_COARSE_LOCATION(粗略的地理位置信息)权限,如果Apk是以targetSDKVersion=22的方式进行打包的,那么在安装时用户将不得授权我的App这个权限,否则他将无法安装这个应用;如果是以targetSDKVersion=23的形式打包的,而且用户使用的手机是Android6.0的系统,那么在安装时我的App是没有获得读取地理位置权限的,我们需要调用系统提供的requestPermissions接口来申请权限。这时候你可能会说那我还设置targetSDKVersion=23干嘛?还不如直接用22打包得了。。

不要高兴得太早,下面我们会说理由。因为只要用户使用的是6.0系统的手机,他是可以在安装完成以后,在手机的设置界面取消一些dangerous权限的。

下图就是6.0系统上权限管理的界面。

targetSDKVersion和compileSDKVersion的作用

在build.gradle中有这么一段:

android {

compileSdkVersion23

buildToolsVersion"23.0.2"

...

defaultConfig {

...

targetSdkVersion22

...

}

targetSDKVersion:简单来说就代表着你的App能够适配的系统版本,意味着你的App在这个版本的手机上做了充分的前向兼容性处理和实际测试。其实我们写代码时都是经常干这么一件事,就是if(Build.VERSION.SDK_INT >= 23) { ... },这就是兼容性处理最典型的一个例子。如果你的target设置得越高,其实调用系统提供的API时,所得到的处理也是不一样的,甚至有些新的API是只有新的系统才有的,例如前一篇博客里用到WebView的setWebContentsDebuggingEnabled(boolean))方法,这是Android4.4以后才可以用的一个API。

compileSdkVersion:是你SDK的版本号,也就是你在编程时引用的android.jar的版本。一般都会和targetSDKVersion相等,或者比targetSDKVersion高。

因此,如果我们要把自己的App适配到Android6.0系统,首先要把targetSDKVersion和compileSDKVersion全部设置为23。

Android6.0运行时权限系统到底是干嘛的?

介绍了targetSDKVersion和compileSDKVersion以后,我们就知道什么叫做适配到Android X.X了。那么Android6.0这个运行时权限系统和以前最大的不同就在于:将我们以前一股脑儿以标签方式写在AndroidManifest.xml文件中的权限划分成了normal permissiondangerous permission

Normal Permission:你写在xml文件里,那么App安装时就会默认获得这些权限,即使是在Android6.0系统的手机上,用户也无法在安装后动态取消这些normal权限,这和以前的权限系统是一样的,不变。

Dangerous Permission:你还是得写在xml文件里,但是App安装时具体如果执行授权分以下几种情况:

targetSDKVersion < 23&API(手机系统) < 6.0:安装时默认获得权限,且用户无法在安装App之后取消权限。

targetSDKVersion >= 23&API(手机系统) < 6.0:安装时默认获得权限,且用户无法在安装App之后取消权限。

targetSDKVersion < 23&API(手机系统) >= 6.0:安装时默认获得权限,但是用户可以在安装App完成后动态取消授权(取消时手机会弹出提醒,告诉用户这个是为旧版手机打造的应用,让用户谨慎操作)。

targetSDKVersion >= 23&API(手机系统) >= 6.0:安装时不会获得权限,可以在运行时向用户申请权限。用户授权以后仍然可以在设置界面中取消授权。

6.0手机上取消授权的界面如下,如果是targetSDKVersion < 23打包的应用,取消权限时,会:

我们可以看到其实只有在6.0的机器上,打包了适配到6.0的App,才需要做一些明显的权限适配工作。但是实话说,不论是不是适配6.0系统,我们都应该在调用需要权限的接口前,检查一下是否具有具有该权限。因为我们会遇到厂商的修改过权限系统的ROM,也有可能自己忘记在xml里加上权限清单。当然这里面也会有坑,因为有时在不同厂商手机上直接调用checkCallingOrSelfPermission方法得到的结果并不准确。

如果我不target到23会怎么样?

很显然,如果不target到23,短期内还可以不写权限适配的代码。但是!!!前面提到了,用户仍然可以在6.0的手机上取消安装时默认赋予的dangerous权限。那么这时候会发生什么????如果这个API原本应该返回的是对象,那么这时将返回null;如果这个API原本应该返回的是数字,这时就是0。可想而知,如果你只是对返回的null或者0做了一些不恰当的处理,App还是可能会crash的。所以这不是长久之计,尽快地处理好权限申请才是王道,这也是一种对App、对用户更负责的做法。

如何在运行时申请权限 & 官方的权限分级列表

关于如何适配到6.0的权限系统,网上有非常多的例子,我觉得看了这篇文章基本上就OK了,因为网上很多貌似都翻译自这篇文章,强力推荐一下:things-you-need-to-know-about-android-m-permission

Google官方的RuntimePermissions介绍:runtime-permissions

Google官方的dangerous权限及分组:permissions: normal-dangerous

开源社区-权限适配组件:伟大的开源社区已经有轮子了,可以学习一下!

PermissionHelper

PermissionsDispatcher

PermissionGen

TedPermission:不用自己调用checkSelfPermission(), requestPermissions(),然后再处理回调onRequestPermissionsResult(), onActivityResult()。只要一行代码,设置一个listener就可以监听授权的结果,使用起来非常简单。内部实现采用的是类似event bus的otto实现的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355

推荐阅读更多精彩内容