Permission是用来限制应用程序对设备上的数据和功能的使用权限。这种限制是用来保护关键的数据和功能防止被误用而危害用户的使用。
每一个permission都有一个独立的标签用来指示那种操作被限制。如:
android.permission.CALL_EMERGENCY_NUMBERS
android.permission.READ_OWNER_DATA
android.permission.SET_WALLPAPER
android.permission.DEVICE_POWER
一个功能特性的权限至多只能被一个permission保护。如果一个应用程序需要拥有权限,来使用被某permission保护的功能特性,需要在其AndroidManifest文件中用<uses-permission>元素来请求相应的permission。当这个应用程序被安装到设备上的时候,安装程序将会通过检查该应用程序签名证书的权限或通过询问用户来判断是否授权该permission的请求。如果该程序获取这个permission的授权,就可以使用该permission保护的功能了。否则,该应用程序在企图使用这个功能时将会失败,并且不会有任何通知给用户。
应用程序也可以用permission保护自己的组件,如:activities, services,broadcast receivers, and content providers。这里可以使用任何的permission,可以是Android系统的,也可以是其他程序定义的或者是自己定义的。可以在Manifest文件中用<permission>元素来定义一个新的permission。
<permission-tree>元素是用来申明一组新定义的permission的命名空间。<permission-group>元素是用来定义一组permission的公共标签,主要作用是给用户显示分组。在<permission-group>元素中不会指定哪些permission在该组中,仅给出的是组标签的名字。一个permission想要加入到一个permission group的方法是,在定义permission的<permission>元素中由permissionGroup属性指定。
1. <permission><permission android:description="stringresource"
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:permissionGroup="string"
android:protectionLevel=["normal"| "dangerous"|"signature"| "signatureOrSystem"]
/>
实例:
<!-- Allowsapplications to open network sockets. -->
<permission android:name="android.permission.INTERNET"
android:permissionGroup=" "
android:protectionLevel="dangerous"
android:description="@string/permdesc_createNetworkSockets"
android:label="@string/permlab_createNetworkSockets"/>
该元素是用来定义一个安全许可,用来限制使用指定的组件和应用程序(不局限于本应
用程序)功能的权限。具体使用可见application, activity, provider, receive等元素的permission的属性。
该元素的具体属性描述:
android:description
关于该permission的一个可读的描述,比标签中包含的信息要多。在安装应用程序时,如需用户判断是否要授权该permission时,该信息会显示给用户。该属性必须要是Resource中的string资源的引用,不可以是原始的字符串。
android:icon
描绘该permission的图标,需要是drawable资源的引用。
android:label
permission的名字,会显示给用户。为了方便,在开发的时候这边可以使用原始的字符串。
但是在软件准备发布的时候还是要换成资源中的String资源的引用,这样方便做软件的本地化。
android:name
permission的名字,该名字用于在程序中与该permission的关联。如在其他元素中permission的属性的指定。
android:permissionGroup
分派该permission到一个指定的permission group中。该处的值必须要是<permission-group>元素申明的group的名字。如果该属性不设定,则该permission不属于任何permission group。
android:protectionLevel
安全的等级。用来指示该permission被授权可能引起的危险。在应用程序请求该permission是系统判断是否要直接授权的标准。该属性可以有以下几个赋值:
normal:默认值。给应用程序该许可的授权仅是应用程序功能级别的,许可的危害比较低,对其他的应用或系统和用户的危害最小。在安装程序时,系统会直接授权这类的许可请求,不用询问用户的判断。在安装程序前用户也可以通过选项来查看该许可的描述。
dangerous:高危害的许可,请求该许可的应用程序可以使用用户数据或控制设备的功能,可能会对用户产生消极的影响。因为这类许可可能引入潜在的危害,所以系统不会自动给请求的应用程序授权。处理请求这类许可的应用程序安装时,系统会提用户并请求用户确认。
signature 在应用程序的签名证书中声明了改许可时系统才会自动授权。如果证书匹配通过,系统会自动许可该类许可请求的授权,不会有通知给用户确认。
signature| system:系统仅会授权那些包含在Android系统镜像文件中的应用程序或和系统镜像文件使用相同证书的应用程序的许可请求。这种类型需要避免使用,因为在正常情况下使用signature类型已经足够。这种许可类型仅在以下情况下需要使用:多个开发者的应用程序需要同时编译进Android镜像文件,并且因为这些应用程序需要一起编译而要共享一些指定的功能。2. <permission-group>
<permission-group
android:description="stringresource"
android:icon="drawable resource"
android:label="string resource"
android:name="string"
/>
实例:
<!-- Used forpermissions that provide access to networking services. The
main permission hereis internet access, but this is also an
appropriate group for accessing ormodifying any network configuration
or other related network operations.-->
<permission-group android:name="android.permission-group.NETWORK"
android:label="@string/permgrouplab_network"
android:icon="@drawable/perm_group_network"
android:description="@string/permgroupdesc_network"
android:priority=" 270" />该元素声明把一组有关系的permission聚集在一起的名字。单个的permission加入到permission group的方法是permission定义时<permission>元素的permissionGroup属性中指定。同一个permission group的成员在用户接口中显示在一起。这个元素并不是申明permission,只是申明一个盛放permission的集合。
该元素的具体属性描述:
android:description
关于该permissiongroup的一个可读的描述,比标签中包含的信息要多。该属性必须要是Resource中的string资源的引用,不可以是原始的字符串。
android:icon
描绘该permissiongroup的图标,需要是drawable资源的引用。
android:label
permission group的名字,会显示给用户。为了方便,在开发的时候这边可以使用原始的字符串。但是在软件准备发布的时候还是要换成资源中的String资源的引用,这样方便做软件的本地化。
android:name
permissiongroup的名字,该名字是用于在<permission>元素的<permissionGroup>属性的赋值。3. <permission-tree>
<permission-tree
android:icon="drawable resource"
android:label="string resource"
android:name="string"
/>
该元素申明一个权限树的根名称。应用程序拥有该树的所有权限。通过addPermission()
方法可以动态添加一个permission到权限树中。在权限树中的权限许可的名称中需要以‘.’来分开,以表示在权限树中的位置。该元素不会定义一个权限许可,只是定义一个权限许可的命名空间以供新的权限许可定义命名时使用。
该元素的具体属性描述:
android:icon
描绘该permissiontree的图标,需要是drawable资源的引用。
android:label
permission tree的名字,会显示给用户。为了方便,在开发的时候这边可以使用原始的字符串。但是在软件准备发布的时候还是要换成资源中的String资源的引用,这样方便做软件的本地化。
android:name
permissiontree根的名字,该名字是所有在该权限树中权限许可的名字的前缀。在JAVA的风格中需要确定名字的唯一性,该名字中必须要有两个以上的”.”。4. <path-permission>
<path-permissionandroid:path="string"
android:pathPrefix="string"
android:pathPattern="string"
android:permission="string"
android:readPermission="string"
android:writePermission="string"
/>
该元素是在contentprovider中为指定的数据路径定义权限许可。可以多次使用该元素定义多个路径的权限许可。
属性的具体描述:
android:path
Content provider数据子集的完整的uri路径。仅路径指定的特定数据可以被授权。当用provider来搜索指定的content内容时,需要添加"/search_suggest_query".字串。
android:pathPrefix
Content provider数据uri路径的开始部分。可以授权具有和指定的开始部分相同的数据路径的uri。
android:pathPattern
指定一个完整的contentprovider的数据路径的uri,其中可以包含一下的通配符:
星号(‘*’) :这个匹配符可以匹配0到多个之前刚出现的字符。
一个点和一个星(‘.*’): 这个可以匹配0或多个字符的任意顺序。因为在从XML中读取字符串时(在程序解析前),’\’是用作转义字符,所以需要双倍的转义符。如‘*’需要写成’\\*’
android:permission
应用程序需要读/写content provider数据所需要的权限许可。这个属性是为了方便设定可以同时读写的权限。但是,readPermission和writePermission属性的优先级要比该属性要高。
android:readPermission
应用程序要查询contentprovider数据所需的权限许可。
android:writePermission
应用程序需要修改content provider的数据所需的权限许可。5. <grant-uri-permission>
<grant-uri-permissionandroid:path="string"
android:pathPattern="string"
android:pathPrefix="string"
/>
指定contentprovider中什么数据的子集可以被授权许可。数据子集是通过URI路径的方式指定,是content:URI中的URI部分。这种权限许可是允许应用程序一次性的不受限制使用content指定的数据,而不是正常的获取权限许可。如果在content provider中的grantUriPermissions属性值设为”true”,则权限许可可以授权porvider下的任何数据,这种权限许可授权的方式为在启动该组件的Intent中设FLAG_GRANT_READ_URI_PERMISSION和FLAG_GRANT_WRITE_URI_PERMISSIONflag。如果该属性值设为”false”,权限许可仅可以被授权该元素指定路径下的数据。
属性的具体描述:
android:path
Content provider数据子集的完整的uri路径。仅路径指定的特定数据可以被授权。当用provider来搜索指定的content内容时,需要添加"/search_suggest_query".字串。
android:pathPrefix
Content provider数据uri路径的开始部分。可以授权具有和指定的开始部分相同的数据路径的uri。
android:pathPattern
指定一个完整的contentprovider的数据路径的uri,其中可以包含一下的通配符:
星号(‘*’) :这个匹配符可以匹配0到多个之前刚出现的字符。
一个点和一个星(‘.*’): 这个可以匹配0或多个字符的任意顺序。因为在从XML中读取字符串时(在程序解析前),’\’是用作转义字符,所以需要双倍的转义符。如‘*’需要写成’\\*’
6. <instrumentation><instrumentation
android:functionalTest=["true"|"false"]
android:handleProfiling=["true"|"false"]
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:targetPackage="string"
/>
申明一个Instrumentation类,用来监测应用程序和系统间的交互。Instrumentation类的对象将在应用程序的所有组件之前实例化。
属性具体描述:
android:functionalTest
是否运行Instrumentation类的功能测试,如果值为”true”,则运行功能测试,为”false”不运行功能测试。默认情况下,该值为“false“。
android:handleProfiling
是否可以控制打开或关闭日志记录。如果值为“true“,则可以控制日志的打开和关闭操作;如果值为”false“,则不可以控制打开或关闭日志,此时日志会一直记录直到对象销毁。默认值为“false”。
android:icon
描绘该Instrumentation类的图标,需要是drawable资源的引用
android:label
Instrumentation类的一个可读的标签。可以是资源中的字符串也可以是原始的字串。
android:name
Instrumentation的子类的名字。必须是一个完整的类名,包含类的包名。不过,可以简写,以’.’开始,会自动把<manifest>元素中的包名称添加到这类名前。该属性没有默认值,必须要指定。
android:targetPackage
指定Instrumentation类对象监测的应用程序名。该应用程序名是在它的manifest文件的<manifest>元素中指定的包名。