Android系统编程入门系列之应用权限的使用

应用权限的定义与申请一文中,已经将权限分为普通权限与危险权限,而且所有权限都必须静态或动态申请。那么应用程序申请某些权限后可以执行什么操作呢?本文将详细介绍。

对于Android系统中的相关权限,可以参考官方权限列表文档。如在前文提到的外部存储读权限Manifest.permission.READ_EXTERNAL_STORAGE获取后,应用程序就可以读取外部存储设备上的文件信息、网络访问权限Manifest.permission.INTERNET获取后,应用程序就可以访问互联网、读取联系*限Manifest.permission.READ_CONTACTS获取后,应用程序就可以读取手机中保存的联系人列表、等等、系统权限的相关内容便不再赘述。

除此之外,应用程序也可以自定义权限,以对其他使用方提供权限校验。自定义权限的相关定义,同样在应用程序的清单文件中。
使用<permission />标签声明一条自定义权限信息。
在该标签内部,android:name属性可以设置权限名称的字符串,由于应用程序所安装的系统中所有权限都是唯一的,所以权限名称通常以应用程序包名前缀;
还必需设置android:protectionLevel权限级别属性,该属性值只能是系统已经定义的normal普通权限级别、signature签名权限级别、dangerous危险权限级别、或appop特殊权限级别;
另外还有android:label权限标签和android:description权限描述两个属性,均必须以字符串内容赋值,用来介绍权限的相关信息,其中标签属性值要尽可能简短,而描述属性值要尽可能详细。这两个属性在应用程序的权限管理中展示给用户查看。
在该标签中,还可以设置android:permissionGroup权限分组属性,系统权限已经分别归入系统分组中,各系统组别由android.Manifest.permission_group静态类中的各字符串常量定义。或者使用标签<permission-group />定义一个新的分组。

不管是系统权限,还是自定义权限,声明方式都是遵循上篇文章中的步骤。

一般在需要系统权限的地方,系统都已经提前写好了相关需求。
而需要自定义权限的相关地方,需要应用程序提前写明。通常是在清单文件中关于四大组件的标签中定义需求权限。在<activity /><service /><receiver />中使用android:permission所需权限属性,但是在<provider />有包括android:readPermission读取权限和android:writePermission写入权限两个属性对读取数据和写入数据分别提出权限需求。
这样,其他应用程序或进程在申请启动该组件时,就必须先申请其需求权限,才能正常启动该组件,不然将会抛出java.lang.SecurityException安全异常。