我正在尝试获取具有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的内容?它是私人的吗?没什么可找的。 p>
答案 0 :(得分:1)
因为此权限具有signature
保护级别。根据{{3}}:
仅当请求的应用程序使用与声明该权限的应用程序相同的证书签名时,系统才会授予该权限
所以requestedPermissionsFlags
是正确的-仅授予com.android.nfc
。
实际上,REQUEST_INSTALL_PACKAGES
具有signature|appop
的保护级别,这就是为什么尽管没有为他们授予此权限,但不仅系统应用程序可以使用它的原因。有关更多详细信息-documentation。