【问题标题】:Is it possible to check if another app has been granted a permission on Android 6.0+? [duplicate]是否可以检查另一个应用程序是否已获得 Android 6.0+ 的权限? [复制]
【发布时间】:2016-09-06 23:27:39
【问题描述】:

我想检查另一个应用是否已被授予“危险”或“系统”级别的权限。

我已尝试加载另一个应用程序的上下文并调用 packageContext.checkCallingPermission(permission)。但是,文档说它会返回

如果允许调用 pid/uid 获得该权限,则为 PERMISSION_GRANTED,如果不允许,则为 PERMISSION_DENIED。

是否可以检查其他应用是否已获得权限?

这是我的尝试(我在意识到它检查调用 pid/uid 并且似乎没有考虑上下文之前写了它):

void checkAllGrantedPermissions(Context context) {
  PackageManager pm = context.getPackageManager();

  // get all installed apps with info about what permissions they requested.
  List<PackageInfo> packageInfos = pm.getInstalledPackages(PackageManager.GET_PERMISSIONS);

  // Get the hidden method PermissionInfo#protectionToString(int) so we can log info about the requested permission
  Method protectionToString;
  try {
    protectionToString = PermissionInfo.class.getDeclaredMethod("protectionToString", int.class);
    if (!protectionToString.isAccessible()) protectionToString.setAccessible(true);
  } catch (NoSuchMethodException e) {
    throw new RuntimeException(e);
  }

  // loop through all installed apps
  for (PackageInfo packageInfo : packageInfos) {

    if (packageInfo.requestedPermissions == null) {
      // No permissions are requested in the AndroidManifest
      continue;
    }

    String appName = packageInfo.applicationInfo.loadLabel(pm).toString();
    String packageName = packageInfo.packageName;

    // loop through all requested permissions in the AndroidManifest
    for (String permission : packageInfo.requestedPermissions) {

      PermissionInfo permissionInfo;
      try {
        permissionInfo = pm.getPermissionInfo(permission, 0);
      } catch (PackageManager.NameNotFoundException e) {
        Log.i(TAG, String.format("unknown permission '%s' found in '%s'", permission, packageName));
        continue;
      }

      // convert the protectionLevel to a string (not necessary, but useful info)
      String protLevel;
      try {
        protLevel = (String) protectionToString.invoke(null, permissionInfo.protectionLevel);
      } catch (Exception ignored) {
        protLevel = "????";
      }

      // Create the package's context to check if the package has the requested permission
      Context packageContext;
      try {
        packageContext = context.createPackageContext(packageName, 0);
      } catch (PackageManager.NameNotFoundException wtf) {
        continue;
      }

      int ret = packageContext.checkCallingPermission(permission);
      if (ret == PackageManager.PERMISSION_DENIED) {
        Log.i(TAG, String.format("%s [%s] is denied permission %s (%s)",
            appName, packageName, permission, protLevel));
      } else {
        Log.i(TAG, String.format("%s [%s] has granted permission %s (%s)",
            appName, packageName, permission, protLevel));
      }
    }
  }
}

【问题讨论】:

  • @adneal 谢谢!我还需要检查REQUESTED_PERMISSION_REQUIRED 标志。如果您将此作为答案发布,我会接受。

标签: android android-6.0-marshmallow android-permissions


【解决方案1】:

是否可以检查其他应用是否已获得权限?

是的。您可以使用PackageInfo.requestedPermissionsFlags 检索给定包的清单中每个&lt;uses-permission&gt; 标记的标志,然后使用按位运算将这些标志与PackageInfo.REQUESTED_PERMISSION_GRANTED 进行比较。

我想检查其他应用是否被授予“危险”或 “系统”级权限。

您可以使用PackageManager.getPermissionInfo 执行此检查,然后将PermissionInfo.protectionLevelPermissionInfo.PROTECTION_DANGEROUSPermissionInfo.PROTECTION_SIGNATURE 之一进行比较。

例如

    final PackageManager pm = getPackageManager();
    // Loop each package requesting <manifest> permissions
    for (final PackageInfo pi : pm.getInstalledPackages(GET_PERMISSIONS)) {
        final String[] requestedPermissions = pi.requestedPermissions;
        if (requestedPermissions == null) {
            // No permissions defined in <manifest>
            continue;
        }
        // Loop each <uses-permission> tag to retrieve the permission flag
        for (int i = 0, len = requestedPermissions.length; i < len; i++) {
            final String requestedPerm = requestedPermissions[i];
            // Retrieve the protection level for each requested permission
            int protLevel;
            try {
                protLevel = pm.getPermissionInfo(requestedPerm, 0).protectionLevel;
            } catch (PackageManager.NameNotFoundException e) {
                Log.e(TAG, "Unknown permission: " + requestedPerm, e);
                continue;
            }
            final boolean system = protLevel == PROTECTION_SIGNATURE;
            final boolean dangerous = protLevel == PROTECTION_DANGEROUS;
            final boolean granted = (pi.requestedPermissionsFlags[i]
                    & REQUESTED_PERMISSION_GRANTED) != 0;
        }
    }

欲了解更多信息,请查看:

【讨论】:

  • 嘿兄弟,它不适用于所有应用程序,请尝试 viber 应用程序
  • 在 viber 中,即使我禁用了所有权限,它也显示所有应用程序权限为真
  • 授予权限!= 请求权限。
  • @JeffreyBlattman final boolean granted = (pi.requestedPermissionsFlags[i] &amp; REQUESTED_PERMISSION_GRANTED) != 0;?
  • 不幸的是,这对我不起作用。在final boolean granted = (pi.requestedPermissionsFlags[i] &amp; REQUESTED_PERMISSION_GRANTED) != 0; 之后我有granted == true,但我手动禁用了我设备上所有应用程序的SYSTEM_ALERT_WINDOW 权限。
猜你喜欢
  • 1970-01-01
  • 2016-10-21
  • 1970-01-01
  • 2017-04-23
  • 2023-03-23
  • 1970-01-01
  • 2015-01-24
  • 2015-09-14
  • 1970-01-01
相关资源
最近更新 更多