原文转自:http://blog.csdn.net/liuhe688/article/details/6417983 html
Android定义了一种权限方案来保护设备上的资源和功能。例如,在默认状况下,应用程序没法访问联系人列表、拨打电话等。下面就以拨打电话为例介绍一下系统对权限的要求。通常在咱们的应用中,若是要用到拨打电话的功能,咱们会这样编码: java
默认状况下,咱们无权访问拨打电话的Activity,控制台将会报如下异常信息: android
看来,咱们是缺乏了CALL_PHONE这个权限,这个权限是Android系统自带的phone应用里定义的权限: 安全
想要使用此功能,必须在咱们的AndroidManifest.xml文件中声明使用此权限: app
这告诉系统,咱们的应用使用了此权限,咱们有权访问拨打电话的Activity。 ide
咱们不只要问,为何系统会这样设计呢?答案是为了保护用户资源的安全。要想使用此功能,必须在应用中声明权限信息,这样一来,在用户安装此应用时系统会从应用中提取出权限信息,告诉用户该应用使用到了哪些功能,由用户判断该应用是否损害本身的安全。 ui
接下来由我来演示一下权限的定义和使用,咱们创建一个phone项目,项目结构以下: this
咱们设计的流程是在MainActivity中点击按钮,而后跳转到PhoneActivity中,咱们会为PhoneActiivty定义相应的权限。 编码
咱们先看一下MainActivity和PhoneActivity的代码: .net
MainActivity.java以下:
PhoneActivity.java以下:
最重要的是AndroidManifest.xml文件,咱们全部的权限声明配置都在此文件中完成:
须要注意的是,在声明权限时须要一个android:protectionLevel的属性,它表明“风险级别”。必须是如下值之一:
normal、dangerous、signature、signatureOrSystem。
normal表示权限是低风险的,不会对系统、用户或其余应用程序形成危害。
dangerous表示权限是高风险的,系统将可能要求用户输入相关信息,才会授予此权限。
signature告诉Android,只有当应用程序所用数字签名与声明此权限的应用程序全部数字签名相同时,才能将权限授给它。
signatureOrSystem告诉Android,将权限授给具备相同数字签名的应用程序或Android包类,这一级别适用于很是特殊的状况,好比多个供应商须要经过系统影像共享功能时。
另一个是android:permissionGroup属性,表示一个权限组。能够将权限放在一个组中,但对于自定义权限,应该避免设置此属性。若是确实但愿设置此属性,能够使用如下属性代替:android.permission-group.SYSTEM_TOOLS。
下面是两个活动的截图:
以上过程都是在一个内部完成的,如今假如咱们的这个phone应用做为系统内置的应用,作为开发者,咱们新建一个app,而后访问phone应用里的PhoneActivity。app的结构图以下:
咱们在MainActivity里放置一个按钮,点击以后跳转到phone应用的PhoneActivity中。MainActivity.java代码以下:
而后咱们须要在AndroidManifest.xml文件中配置相应的权限:
点击按钮,就能够顺利地跳转到PhoneActivity了。截图以下: