先上图,看看最终我们可以得到什么样子的结果:

截图来自 android开发工具箱, 点我下载 android开发工具箱

 

应用内权限信息分为两个部分,我们先来看应用内权限使用情况。

PackageManager pm = context.getPackageManager();PackageInfo packageInfo = pm.getPackageInfo(packageName, PackageManager.GET_PERMISSIONS);if (packageInfo.requestedPermissions != null) {    for (String permission : packageInfo.requestedPermissions) {        PermissionInfo permissionInfo = pm.getPermissionInfo(permission, 0);        if ((permissionInfo.flags & PermissionInfo.FLAG_INSTALLED) == 0                            || (permissionInfo.flags & FLAG_REMOVED) != 0) {            continue;        }        boolean isHasPermission = PackageManager.PERMISSION_GRANTED == pm.checkPermission(permission, packageName);        ...    }}

获取权限列表步骤大致为:

1. 先从PackageInfo获取应用内使用权限的列表,得到一个String数组
2. 遍历数组,使用PackageManager获取PermissionInfo对象
3. 根据permissionInfo.flags对结果进行筛选
4. 判断应用是否已经获得了此权限

这样,我们的列表所需的数据就齐了。下面我们看看PermissionInfo里面都有些什么我们需要的信息

public class PermissionInfo extends PackageItemInfo implements Parcelable {    public int protectionLevel;    public @Nullable String group;    public @Flags int flags;    //获取权限描述信息    public @Nullable CharSequence loadDescription(@NonNull PackageManager pm) {        ...    }}

我们使用上面的信息即可获取权限的level、group、权限的描述。flags是之前我们用到的属性。

系统没有提供给我们把int类型的protectionLevel转换成String的方法,但是,PermissionInfo类中有个隐藏的方法:

/** @hide */@UnsupportedAppUsagepublic static @NonNull String protectionToString(int level) {    String protLevel = "????";    switch (level & PROTECTION_MASK_BASE) {        case PermissionInfo.PROTECTION_DANGEROUS:            protLevel = "dangerous";            break;        case PermissionInfo.PROTECTION_NORMAL:            protLevel = "normal";            break;        case PermissionInfo.PROTECTION_SIGNATURE:            protLevel = "signature";            break;        case PermissionInfo.PROTECTION_SIGNATURE_OR_SYSTEM:            protLevel = "signatureOrSystem";            break;    }    ...}

这里不但隐藏了,还加了UnsupportedAppUsage注解,所以只能复制出来一份了。同时,这段代码也给出了判断一个权限是否是危险权限的方法:

public static boolean isDangerous(int level) {    return (level & PermissionInfo.PROTECTION_MASK_BASE) == PermissionInfo.PROTECTION_DANGEROUS;}

系统没有直接提供获取权限描述的属性,但是提供了方法loadDescription,最后来看一下group。

group的概念是android6引入运行时权限引入了,但是到了android10,应用无法在界面中查询权限的分组方式。所以我们在不同版本上获取group信息会有所不同。

下面以`android.permission.ACCESS_FINE_LOCATION`权限为例。

在android6-9上面,我们获取到的group内容为:

android.permission-group.LOCATION

在android10上面获取到的group内容为:

> android.permission-group.UNDEFINED

综上,显示应用内使用的权限的几个关键信息:权限名称、级别、分组以及权限描述就都有了。

自定义权限要要更简单一点

if (packageInfo.permissions != null) {    for (PermissionInfo permissionInfo : packageInfo.permissions) {        boolean isHasPermission = PackageManager.PERMISSION_GRANTED == pm.checkPermission(permissionInfo.name, packageName);        ...    }}

packageInfo.permissions是PermissionInfo数组,所以少了使用PackageManager获取PermissionInfo对象这一步,其余逻辑与展示系统权限逻辑完全一致,至此,我们就能制作一个展示应用内权限的页面了。

 

点我下载 android开发工具箱

更多相关文章

  1. android broadcastReceiver生命周期及两种应用——四大组件之Bro
  2. IBM网站文章: XML, JSON, ANDROID
  3. AndroidMenifest.xml中android:sharedUserId="android.uid.syste
  4. Android(安卓)4编程入门经典
  5. Android中Message机制的灵活应用
  6. AndroidManfest
  7. android 在google商店里搜索不到的问题
  8. 修改Android自带的JAVA应用程序
  9. Android(安卓)应用安装位置

随机推荐

  1. MySQL中“:=”和“=”的区别浅析
  2. MySQL查看和修改时区的方法
  3. 解决mysql与navicat建立连接出现1251错误
  4. navicat 8 for mysql建库的方法
  5. 将MySQL去重操作优化到极致的操作方法
  6. 监听mysql表内容变化 mysql开启binlog
  7. CentOS7离线安装MySQL的教程详解
  8. Mysql数据库监听binlog的开启步骤
  9. centos7.2下安装mysql5.7数据库的命令详
  10. 如何将Excel文件导入MySQL数据库