自定义权限 permission

<permission
android:name="com.android.launcher.permission.INSTALL_SHORTCUT"
android:permissionGroup="android.permission-group.SYSTEM_TOOLS"
android:protectionLevel="normal"
android:label="@string/permlab_install_shortcut"
android:description="@string/permdesc_install_shortcut" />

声明的含义如下;

android:label:权限名字,显示给用户的,值可是一个 string 数据,例如这里的“自定义权限”。

android:description:比 label 更长的对权限的描述。值是通过 resource 文件中获取的,不能直接写 string 值,例如这里的”@string/test”。

android:name:权限名字,如果其他 app 引用该权限需要填写这个名字。

android:protectionLevel:权限级别,分为 4 个级别:

○normal:低风险权限,在安装的时候,系统会自动授予权限给 application。

○dangerous:高风险权限,系统不会自动授予权限给 app,在用到的时候,会给用户提示。

○signature:签名权限,在其他 app 引用声明的权限的时候,需要保证两个 app 的签名一致。这样系统就会自动授予权限给第三方 app,而不提示给用户。

○signatureOrSystem:这个权限是引用该权限的 app 需要有和系统同样的签名才能授予的权限,一般不推荐使用。

声明和强制实施权限

要强制执行自己的权限,首先必须使用一个或多个<permission>标签,在AndroidManifest.xml文件中来声明它们。

例如,应用程序想要控制谁能够启动它的一个Activity,就能够用下面的方法来为这个操作声明一个权限:

<manifestxmlns:android="http://schemas.android.com/apk/res/android"
    package="com.me.app.myapp">
    <permissionandroid:name="com.me.app.myapp.permission.DEADLY_ACTIVITY"
        android:label="@string/permlab_deadlyActivity"
        android:description="@string/permdesc_deadlyActivity"
        android:permissionGroup="android.permission-group.COST_MONEY"
        android:protectionLevel="dangerous"/>
    ...
</manifest>

<protectionLevel>属性是必须的,它告诉系统怎样把应用程序需要的权限通知给用户,或者是允许谁拥有这个权限。

<permissionGroup>属性是可选的,并且只用于帮助系统把相关权限显示给用户。通常用标准的系统组来设置这个属性,当然也可以使用自己定义的组(但这很少见)。我们推荐使用既存的分组,这样会简化给用户的显示的权限UI。

要注意的时,权限所支持的label和description属性。它们是能够显示给用户的字符串资源,android:label属性用于权限列表的显示,android:description属性用于单一权限的详细介绍。label属性值应该是简短的,用几个关键的单词来描述被权限保护的功能。description属性应该是权限的详细描述,惯例是使用两句话,第一句话来描述权限的功能,第二句话用来警告用户,如果应用程序获得了这个权限会带来的不利影响。

下面是一个申请CALL_PHONE权限的label和description属性设置的例子:

<stringname="permlab_callPhone">directly call phone numbers</string>
    <stringname="permdesc_callPhone">Allows the application to call
        phone numbers without your intervention. Malicious applications may
        cause unexpected calls on your phone bill. Note that this does not
        allow the application to call emergency numbers.</string>

用系统的Settings应用程序和shell命令:adb shell pm list permissions,能够查看系统中当前定义的权限。Settings应用的使用方法是:Settings->Applications,选择一个应用程序,向下滚动,可以看到这个应用程序所使用的权限。对于开发者,带有“-s”选项的adb命令可以用与用户查看格式相类似的格式来显示权限:

$ adb shell pm list permissions -s
AllPermissions:

Network communication: view Wi-Fi state, create Bluetooth connections, full
Internet access, view network state

Your location: access extra location provider commands, fine (GPS) location,
mock location sources for testing, coarse (network-based) location

Services that cost you money: send SMS messages, directly call phone numbers

...

在AndroidManifest.xml中的强制权限

限制访问系统或应用程序整个组件的高级别权限,能够通过应用程序的AndroidManifest.xml文件来设定。所有这些都要求在被期望的组件上包含android:permission属性,以及用于控制访问的命名权限。

Activity的权限(应用于<activity>标签)限制了谁能够启动被关联的Activity。在Context.startActivity()方法和Activity.startActivityForResult()方法执行期间要检查这个权限,如果调用者没有要求的权限,那么就会从调用中抛出一个SecurityException异常。

Service的权限(应用于<service>标签)限制了谁能够启动或绑定被关联的服务。在Context.startService()方法、Context.stopService()方法和Context.bindService()方法执行期间会检查这个权限,如果调用者没有要求的权限,那么就会从调用中抛出一个SecurityException异常。

BroadcastReceiver的权限(应用于<receiver>标签)限制了谁能够发送广播通知给关联的接收器。在Context.sendBroadcast()方法返回后会检查这个权限,也就是在系统试图把提交的广播通知发送给设定的接收器的时候。在因没有权限而失败的时候,它不会向调用者抛出一个异常,它只是不发送Intent对象。同样,给Context.registerReceiver()方法提供的权限,是用来控制谁能够向程序中注册的接收器发送广播。另一种方式是,在调用Context.sendBroadcast()方法时,提供一个权限,来限制那个BroadcastReceiver对象能够接收广播通知。

ContentProvider的权限(应用于<provider>标签)限制了谁能够访问ContentProvider对象中的数据。(内容提供有一套额外的叫做URI权限的重要且易用的安全权限,稍后会介绍。)跟其他组件不同,它有两个独立的权限属性:android:readPermission用于限制谁能够从提供器中读取数据;android:writePermission用于限制谁能够向提供器中写入数据。要注意的是,如果提供器受到读写权限的保护,只拥有写权限并不意味着能够从提供器中读取数据。在首次获取提供器和执行提供器相关的操作时,会进行权限的检查(如果没有权限,就会抛出一个SecurityException异常)。使用ContentResolver.query()方法查询数据时,要求具有读权限,使用ContentResolver.insert()方法、ContentResolver.update()方法、ContentResolver.delete()方法编辑数据时,要求具有写权限。在所有的场景中,如果没有要求的权限,这个调用就会导致一个SecurityException异常被抛出。

发送广播时的强制权限

除了强制谁能够把Intent对象发送给一个BroadcastReceiver对象的权限之外,在发送一个广播通知时,还可以指定需求权限。通过调用带有权限字符串的Context.sendBroadcast()方法,可以要求接收器必须要拥有这个权限,才能够接受这个广播通知。

要注意的是,接收器和广播器都能够要求权限,发生这种情况时,双方的权限都必须检查通过后,才可以把Intent对象发送给匹配的目标。

其他强制性权限

在调用Service过程中,可以设置更细粒度的权限。这种设置是通过调用Context.checkCallingPermission()方法来完成的。调用时给这个方法传入所期望的权限字符串,它会返回一个整数,它指明了所期望的权限是否被当前调用的进程所接受。要注意的是,这种方法只能在执行来自另一个进程调用的时候使用。通常通过IDL接口来发布服务,或者是用其他的方法提供给另一个进程。

有很多有用的检查权限的方法。如果有另一个进程的PID,那么就可以使用Context.checkPermission(String, int, int)方法,针对这个PID来检查权限。如果有另一个应用程序的包名,就可以直接使用包管理器的PackageManager.checkPermission(String, String)方法来找出这个包是否已经被授予了指定的权限。

URI权限

到目前为止我们所介绍的标准的权限系统不能满足内容提供器的使用需要。内容提供器可能要保护它自己的读写权限,但是为了某些操作,它的客户端也需要把指定的URI交给另一个应用程序来处理。一个典型的示例是Mail应用程序中的附件。邮件的访问应该是受到权限的保护,因为这个用户敏感的数据。但是,如果要把一个图片附件的URI提供给一个Image浏览器,那么这个Image浏览器就会因没有权限而不能打开这个图片附件。

这个问题的解决方案是给每个URI都分配一个权限,当启动一个Activity或给一个Activity返回结果时,调用者能够设置Intent.FLAG_GRANT_READ_URI_PERMISSION和(或)Intent.FLAG_GRANT_WRITE_URI_PERMISSION权限。这样就给接受Intent对象的Activity授予了访问Intent对象中指定的数据URI的权限,而不管它是否有权访问与这个Intent对象对应的内容提供器中的数据权限。

这种机制允许使用一种共同的能力样式模型,这种模型利用用户交互(打开一个附件、选择一个通讯录等)来驱动设定更细粒度的权限。这种机制可以有效的减少应用程序所需要的权限,只需要那些与它们直接相关行为权限。

这种把权限细化到URI的做法,需要持有这些URI的内容提供器的配合。强烈推荐内容提供器实现这种机制,并且通过android:grantUriPermissions属性或<grant-uri-permissiongs>标签来声明它们所提供的权限。

更多的信息能够在Context.grantUriPermission()、Context.revokeUriPermission()和Context.checkUriPermission()方法中找到。

Android 安全性和权限的更多相关文章

  1. Android签名与权限的安全问题(3)

    签名和权限的作用 Android签名中使用到的一些加密技术有: 公/私钥, SHA1(CERT.SF,MANIFEST.MF), RSA(CERT.RSA), 消息摘要, 移动平台中的主流签名作用: ...

  2. [android开发篇]权限分类:正常权限和危险权限

    https://developer.android.com/guide/topics/security/permissions.html#normal-dangerous 系统权限 本文内容 安全架构 ...

  3. Android 6.0 权限申请辅助 ----PermissionsHelper

    Android 6.0 权限申请辅助 ----PermissionsHelper 项目地址:https://github.com/didikee/PermissionsHelper Android 的 ...

  4. ## Android 6.0 权限申请 ##

    Android 6.0 权限申请 1. 以前的权限申请(sdk<23) 直接在AndroidManifest.xml中申明即可: <uses-permission android:name ...

  5. Android Permission 访问权限大全(转)

    程序执行需要读取到安全敏感项必需在androidmanifest.xml中声明相关权限请求, 完整列表如下: android.permission.ACCESS_CHECKIN_PROPERTIES允 ...

  6. Android获取ROOT权限

    获取Android的ROOT权限其实很简单,只要在Runtime下执行命令"su"就可以了. // 获取ROOT权限 public void get_root(){ if (is_ ...

  7. Google Android 6.0 权限完全解析

    注:本文只针对Google原生Android系统有效, 小米魅族等手机有自己的权限机制, 可能不适用 一.运行时权限的变化及特点 新的权限机制更好的保护了用户的隐私,Google将权限分为两类,一类是 ...

  8. Android 运行时权限处理

    引言 Android 6.0 (API 23) 开始引入了运行时权限检查 (Permissions at Run Time),用户不需要在安装时同意授予应用权限,而是在应用运行时动态去申请所需要的权限 ...

  9. Android 6.0权限管理

    Android 6.0权限管理 关于权限管理 Android6.0 发布之后,Android 的权限系统被重新设计.在 23 之前 App 的权限只会在用户安装的时候询问一次,App一旦安装后就可以使 ...

随机推荐

  1. R文件相关(坑)

    大家来找茬...为什么会出现红字,不能正确引用R文件管理的资源呢? 罪魁祸首就是那个import android.R(我根据IDE提示而自作聪明引用的) 删除那行以后,就不会红字了. 刚开始是拷贝了图 ...

  2. Web-Scale-IT 到底是啥?

    Gartner 对 2015 年 10 大 IT 趋势的预测中有一个词条为:Web Scale IT.我们跟随 Matthias Ankli 来了解一下究竟什么是 Web Scale IT.本文译自 ...

  3. Haskell函数的语法

    本章讲的就是 Haskell 那套独特的语法结构,先从模式匹配开始.模式匹配通过检查数据的特定结构来检查其是否匹配,并按模式从中取得数据. 在定义函数时,你可以为不同的模式分别定义函数本身,这就让代码 ...

  4. Android MonkeyRunner自动拨打电话

    from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice import time device = MonkeyRunner.wa ...

  5. WordPress 开放重定向漏洞

    漏洞名称: WordPress 开放重定向漏洞 CNNVD编号: CNNVD-201309-167 发布时间: 2013-09-13 更新时间: 2013-09-13 危害等级: 高危   漏洞类型: ...

  6. 深入浅出Node.js (附录B) - 调试Node

    B.1 Debugger B.2 Node Inspector B.2.1 安装Node Inspector B.2.2 错误堆栈

  7. Google Map API 学习五

    今天其实收货很大的 1.InfoWindow google.maps.InfoWindow class An overlay that looks like a bubble and is often ...

  8. Linux学习笔记8——VIM编辑器的使用

    在ubuntu中,敲入命令行:sudo apt-get install vim,然后输入系统密码,确认Y,即可下载vim 按下vim,在后面跟上文件的路径,即可进入文件到编辑模式,如果不存在该文件,将 ...

  9. Java基础(十一)常用类总结(一)

    这里有我之前上课总结的一些知识点以及代码大部分是老师讲的笔记 个人认为是非常好的,,也是比较经典的内容,真诚的希望这些对于那些想学习的人有所帮助! 由于代码是分模块的上传非常的不便.也比较多,讲的也是 ...

  10. 关于cocos2d和cocos2dx,还有iOS上的cocos2d的ARC问题

    好吧,我承认这个我花了N个小时所做的努力都白费了. 事情的开始是这样的,今天在写cocos2dx的时候,测试发现总是出现溢出的问题,总是在main.m的autorelease报错.(好吧,如果我以后发 ...