Android如何以编程方式检查权限组是否已授予?
检查Android权限组是否已授予的方法
当然有办法检查权限组的授予状态啦!不过得先明确一点:Android系统本身并没有直接提供检查整个权限组是否全部授予的API,因为权限组里的权限可能被单独授予或拒绝。不过我们可以通过两种思路来实现类似的检查:
1. 遍历权限组内所有权限逐个检查
既然权限组是由多个单个权限组成的,那最直接的方式就是把组里的权限列出来,逐个检查状态——只要有一个没授予,就说明整个权限组没完全开通。
先把你提到的单个权限检查代码补全:
// 单个权限检查的完整代码示例 String permissionKey = android.Manifest.permission.READ_CONTACTS; boolean isGranted = checkSelfPermission(permissionKey) == PackageManager.PERMISSION_GRANTED;
针对CONTACTS权限组,我们可以写一个工具方法来批量验证:
public boolean isContactsPermissionGroupGranted(Context context) { // 列出CONTACTS权限组包含的所有权限 String[] contactsPermissions = { android.Manifest.permission.READ_CONTACTS, android.Manifest.permission.WRITE_CONTACTS, android.Manifest.permission.GET_ACCOUNTS }; for (String permission : contactsPermissions) { // 逐个检查权限状态 if (ContextCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) { return false; } } return true; }
注意:如果你的App目标是Android 6.0(API 23)及以上版本,必须处理动态权限申请,这种检查才是必要的;低于API23的版本,权限在安装时就已全部授予,无需额外检查。
2. 通过权限组名称动态获取权限列表再检查
如果你不想硬编码权限组里的权限,可以通过PackageManager根据权限组名称获取对应的权限列表,再回到第一种思路逐个检查。示例代码如下:
public boolean isPermissionGroupGranted(Context context, String permissionGroupName) { PackageManager pm = context.getPackageManager(); try { // 根据权限组名称获取组信息 PermissionGroupInfo groupInfo = pm.getPermissionGroupInfo(permissionGroupName, 0); String[] permissionsInGroup = groupInfo.permissions; // 遍历检查每个权限 for (String permission : permissionsInGroup) { if (ContextCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) { return false; } } return true; } catch (PackageManager.NameNotFoundException e) { // 传入的权限组名称无效时抛出异常,这里直接返回false e.printStackTrace(); return false; } }
调用时传入CONTACTS权限组的名称即可:
boolean isContactsGroupGranted = isPermissionGroupGranted(this, android.Manifest.permission_group.CONTACTS);
额外小提示
- 有些权限组里可能包含正常权限(比如
GET_ACCOUNTS在部分Android版本中属于正常权限),这类权限不需要动态申请,默认就是授予状态,检查时可以过滤掉,提升效率。 - 如果你的需求是“只要权限组里有一个权限被授予”,那把遍历逻辑改成找到第一个已授予的权限就返回
true即可,不用全检查。
内容的提问来源于stack exchange,提问作者user6747225
相关产品推荐
相关产品推荐

