Android Permission那些事

在Android App开发中我们经常会在AndroidManifest中见到<uses-permission>,<permission>等标签,这些标签是什么?有什么用?今天给大家讲讲关于Android Permission的那些事。

谈到Android Permission,得先来说下Android系统的安全体系。Android构建了一套安全体系,以保证平台上各App之间数据访问的安全性。同时Android是基于Linux内核的,自然也沿用了Linux中的一套安全机制。Linux系统基于用户ID和群组ID建立了一个沙箱机制,这样可以避免数据在不同的用户和群组之间的非法访问。在Android系统系统中,每个App在安装时被分配了一个uid和gid,这样每个App下面的数据就只能被当前App访问。但是,在系统中经常会出现多个App之间需要相互访问的场景,比如访问通讯录,短信,电话记录等,这种该怎么解决呢?Android系统了增加了一个sharedUserId的机制,只要两个App拥有同样的sharedUserId,就可以访问对方的数据了,但是像通讯录,短信和电话这种非常重要的用户隐私数据,用户并不希望直接提供给其他App使用,而是希望在获得用户许可的前提下访问。因此,Android系统增加了一套Permission机制来实现该需求,同时由于Android App是由四大组件构成,Permission机制可以单独添加个单个组件上,这样使得权限的控制力度更加细化和灵活。

Android的权限分为两种

  • 系统权限。其主要用于限制其他App对系统资源或者系统内置应用资源的访问,比如通讯录,短信,传感器,相册,相机等。
  • 自定义权限。其主要用于限制其他App对自身App内部资源的访问。

如何自定义权限?

在AndroidManifest文件中添加<permission>标签,下面细说下这个标签的几个属性:

<permission-group
    android:name="com.xiaofei.permission.GROUP"
    android:description="@string/group_desc"
    android:label="@string/group_label"/>

<permission
    android:name="com.xiaofei.permission.VIEW_PAGE1"
    android:description="@string/perm1_desc"
    android:label="@string/perm1_label"
    android:permissionGroup="com.xiaofei.permission.GROUP"
    android:protectionLevel="dangerous"/>

<permission
    android:name="com.xiaofei.permission.VIEW_PAGE2"
    android:description="@string/perm2_desc"
    android:label="@string/perm2_label"
    android:permissionGroup="com.xiaofei.permission.GROUP"
    android:protectionLevel="dangerous"/>

android:name为权限的名字,必须保证系统内无重复,一般以当前App包名为前缀。当我们在申请权限时需要用到,比如:

ActivityCompat.requestPermissions(MainActivity.this, new String[]{"com.xiaofei.permission.VIEW_PAGE1"}, 0);

android:description 为权限描述,当弹出权限提示框时会显示该描述。如下图:

android:label 为权限标签,在设置->应用->权限中会显示。如下图:

android:permissionGroup 为权限分组,我们可以将权限进行逻辑分组,在设置->应用->权限中会显示。如下图:

android:protectionLevel 为权限的安全级别,不同的级别对应着不同的权限获取行为,这里按从低到高的顺序有以下四种:

  1. normal:普通权限,优先级最低,需要在应用安装时提示用户授权,否则无法安装,而一旦允许,后面APP在运行过程中将一直拥有该权限。
  2. dangerous:危险权限,比如通讯录,短信等,该权限在6.0以下,表现行为与normal无异,但在6.0及以上需要在APP运行过程中动态申请。
  3. signature:获取该权限,必须保证请求方和接收方使用同一个签名文件,在安装时默认授权,不会提示用户。该权限一般用于系统内置应用,或者同一个公司的多个APP中。
  4. signatureOrSystem:相比signature多了一个条件,当请求方为系统应用时默认拥有该权限,一般用于系统内置应用。

接下来说说如何使用权限?

首先,我们必须在AndroidManifest中使用<uses-permission>,来声明App在使用中需要用到的权限。示例代码如下:

<uses-permission android:name="com.xiaofei.permission.VIEW_PAGE1"/>
<uses-permission android:name="com.xiaofei.permission.VIEW_PAGE2"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>

其次,由于android在6.0系统之前和之后对权限的处理行为不一样,因此我们需要根据当前系统版本做区别处理。好在support v4包中已经提供了ActivityCompat类以方便我们对权限的处理,这里给出使用ActivityCompat获取权限的例子:

if (ActivityCompat.checkSelfPermission(MainActivity.this, "com.xiaofei.permission.VIEW_PAGE1") == PackageManager.PERMISSION_DENIED) {
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{"com.xiaofei.permission.VIEW_PAGE1"}, 0);
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    // Todo

}

前面我们提到,Android的权限机制可以让应用数据的访问粒度变得更细,那么这里的粒度细化到什么程度呢?那就是可以通过Permission控制四大组件的访问。比方说:

<activity
    android:name=".MainActivity"
    android:permission="com.xiaofei.permission.VIEW_PAGE1">
</activity>

这里我们在访问MainActivity的时候,就需要提前获取com.xiaofei.permission.VIEW_PAGE1权限,否则系统会禁止访问该页面。当然如果是App内部组件之间的访问,默认已经拥有了该权限,不需要显式获取。

通过权限机制我们就可以很容易的控制第三方App对自己App内部数据的访问,从而可以安全的共享数据。另外这里再提一个属性android:exported,它也是用来控制组件是否可以被第三方App使用的,默认该属性为false,如果设置为true,则第三方App可以通过intent的方式访问该组件。示例代码如下:

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,565评论 25 707
  • 在Android的设计中,资源的访问或者网络连接,要得到这些服务都需要声明其访问权限,否则将无法正常工作。在And...
    a2bfbb8a095f阅读 24,229评论 6 73
  • android.permission.EXPAND_STATUS_BAR 允许一个程序扩展收缩在状态栏,andro...
    pyyy阅读 3,447评论 1 17
  • 前言:权限是一种安全机制。Android权限主要用于限制应用程序内部某些具有限制性特性的功能使用以及应用程序之间的...
    AlicFeng阅读 2,946评论 0 15
  • 目送你离去的背影像花儿般灿烂绽放像草儿般熠熠生辉也许 我不能给你整个春天但 我一定要陪你栽桃种李让你的世界满园春色...
    哲语细细阅读 588评论 29 25