packagemanager中提供的武器,可以用“既多又杂,版本变化大”来形容。
不过,我们通过分类和排序的方法将它们组织起来,让开发者同学们可以学会使用这些强大的武器!
这一节我们将学习:
如何查询系统中都有哪些权限组
每个权限组都有些什么权限
如何查询是否被授予某一权限
如何查询都有哪些应用申请了某一项权限
我们先看第一个大族的api,permission相关的api

创始成员7个. android 2.2版新增1个,android 4.3新增1个,android 6.0再增1个。共计10个。
一共七个,基本上是权限的增,删,检查和查询4种操作。
addpermission:动态新增一个新权限
removepermission:删除一个权限
checkpermission:校验权限是否通过
getallpermissiongroups:获取系统中所有的权限组
getpermissiongroupinfo:查询某个权限组的内容。系统中都有哪些权限组可通过getallpermissiongroups来查询
querypermissionsbygroup:查询一个权限组下面都有些什么权限
getpermissioninfo:根据权限名获取这个权限对象
原型:
参数:
真棒,只有一个选择:get_meta_data。
我们写一段例程看看效果:
日志结果如下:
可见,我当前所用的android m手机上,有下面这些perssiongroup:
android.permission-group.contacts:联系人相关权限组
android.permission-group.phone:电话相关权限组
android.permission-group.appstore_cloud:应用商店云服务相关权限组
android.permission-group.calendar:日历相关权限组
android.permission-group.camera:相机相关权限组
android.permission-group.sensors:传感器相关权限组
android.permission-group.location:位置服务相关权限组
android.permission-group.storage:存储相关权限组
android.permission-group.microphone:话筒相关权限组
android.permission-group.sms:短消息相关权限组
这其中用到的permissiongroupinfo类,用于来存储权限组的信息. 我们后面专门有相关数据结构类的详细说明。
根据字符串来查询特定的perssiongroupinfo。
例程:
通过上面两个方法的学习,我们已经可以获取permissiongroup的信息了。那么,我们如何去知道一个权限组里都有哪些权限呢?
我们可以通过querypermissionsbygroup方法来实现这个需求,请看例程:
输出的结果如下:
从上面的log上我们可以看到,android.permission-group.contacts组里有3个成员:
android.permission.write_contacts:允许该应用修改您手机上存储的联系人的相关数据,包括您通过打电话、发送电子邮件或以其他方式与特定联系人通信的频率。此权限可让应用删除联系人数据。
android.permission.get_accounts:允许该应用获取手机已知的帐户列表,其中可能包括由已安装的应用创建的所有帐户。
android.permission.read_contacts:允许该应用读取您手机上存储的联系人的相关数据,包括您通过打电话、发送电子邮件或以其他方式与特定个人通信的频率。此权限可让应用保存您的联系人数据,而恶意应用可能会在您不知情的情况下分享联系人数据。
根据名字查找对应的权限对象,不多说了,上例程:
输出如下:
检查是否一个包是否被允许某个权限。看例程:
addpermission和removepermission两个方法暂时没见到有人用到,先略过不讲了。
addpermissionasync:异步添加新权限,可以快速返回。可以用于批量添加权限。
这个api也没见有人用过,就不讲了。
getpackagesholdingpermissions:查看当前系统里安装的应用中,哪些使用了这个权限。这个api很好玩啊,能查到哪些应用用到了危险的权限。
输出吓一跳,怎么这么多应用要改联系人!
ispermissionrevokedbypolicy:查看权限是否符合policy的规定。如果policy不允许,就只能换policy,否则无法通过。
公开域:
public charsequence nonlocalizeddescription:如果这个权限组的名字字符串直接定义在androidmanifest.xml中,那么通过这个域就可以得到它的字符串名字。如果是空,那么说明是调用的字符串资源,要去查另一个属性descriptionres。
public int descriptionres:如果上面的nonlocalizeddescription是空,那么这个肯定不空。可以调用loaddescription(pm)方法获取。
其实loaddescription中早已经考虑到上面所讲的两种情况了,调用loaddescription一定能得到描述的字符串:
我们还是通过一个例程来学习下,可以读取到权限的本地语言,如中文的描述,还是挺好玩的哈: