如果已为其他应用程序授予REQUEST_INSTALL_PACKAGES权限,则无法检索

时间:2019-10-03 13:24:36

标签: android kotlin

我正在尝试获取具有REQUEST_INSTALL_PACKAGES权限标记为已授予context.packageManager.getInstalledPackages(PackageManager.GET_PERMISSIONS or PackageManager.GET_META_DATA).forEach { pi -> if (pi.requestedPermissions != null) { for (i in pi.requestedPermissions.indices) { if (pi.requestedPermissions[i] == android.Manifest.permission.REQUEST_INSTALL_PACKAGES) { if ((pi.requestedPermissionsFlags[i] and PackageInfo.REQUESTED_PERMISSION_GRANTED) != 0) { // permission is granted, do stuff here } } } } } 权限的应用程序列表(在Android 8.0+上)。

requestedPermissionsFlags

问题是,相应的REQUESTED_PERMISSION_REQUIRED条目总是 1,这意味着context.packageManager.checkPermission(android.Manifest.permission.REQUEST_INSTALL_PACKAGES, pi.packageName) == PackageManager.PERMISSION_GRANTED,这显然是错误的。

我尝试了不同的api:com.android.nfc,但结果相同。

在不同设备上的Android 8、9和10上进行了尝试,而我唯一的成功是在Pixel 3a上取得了ProductService的肯定。即使我在系统设置中看到chrome和其他应用程序都已授予此权限,其他人也总是错误的。

我是否缺少此API的内容?它是私人的吗?没什么可找的。

1 个答案:

答案 0 :(得分:1)

因为此权限具有signature保护级别。根据{{​​3}}:

  

仅当请求的应用程序使用与声明该权限的应用程序相同的证书签名时,系统才会授予该权限

所以requestedPermissionsFlags是正确的-仅授予com.android.nfc

实际上,REQUEST_INSTALL_PACKAGES具有signature|appop的保护级别,这就是为什么尽管没有为他们授予此权限,但不仅系统应用程序可以使用它的原因。有关更多详细信息-documentation