android - 如果为其他应用授予 REQUEST_INSTALL_PACKAGES 权限,则无法检索

标签 android kotlin

我正在尝试获取具有标记为已授予REQUEST_INSTALL_PACKAGES权限的应用列表(在 Android 8.0+ 上)。

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
                }
            }
        }
    }
}

问题是,相应的 requestedPermissionsFlags 条目总是 1,这意味着 REQUESTED_PERMISSION_REQUIRED 这显然是错误的。

我尝试了不同的 api:context.packageManager.checkPermission(android.Manifest.permission.REQUEST_INSTALL_PACKAGES, pi.packageName) == PackageManager.PERMISSION_GRANTED 结果相同。

我在不同设备上的 Android 8、9 和 10 上进行了尝试,我唯一的成功是在 Pixel 3a 上,它对 com.android.nfc 产生了积极影响。即使我在系统设置中看到 chrome 和其他应用程序已授予此权限,其他人总是错误的。

我是否缺少此 API 的某些内容?是私有(private)的吗?没有太多关于它的信息。

最佳答案

因为此权限具有signature 保护级别。根据documentation :

A permission that the system grants only if the requesting application is signed with the same certificate as the application that declared the permission

所以 requestedPermissionsFlags 是正确的 - 只有 com.android.nfc 被授予。

实际上 REQUEST_INSTALL_PACKAGES 有一个 signature|appop 保护级别,这就是为什么不仅系统应用程序可以使用它,尽管没有为它们授予此权限。有关更多详细信息 - Acquiring Android Permission with Signature Protection Level .

关于android - 如果为其他应用授予 REQUEST_INSTALL_PACKAGES 权限,则无法检索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58220135/

相关文章:

android - 如何让我的应用程序在华为 Mate 10 Pro 或其他 18 :9 ratio phones? 上全屏显示

android - Kotlin:用于数据绑定(bind)的 Java Util Date to String

android - 自动对焦模式在三星 S8 中不起作用

listview - 使用Kotlin的RecyclerView不能垂直放置单元

gradle - 为什么更新 Gradle 到 3.1.0 后显示 "3rd-party Gradle plug-ins may be the cause"?

android - Android 4.4 中的自定义 View 构造函数在 Kotlin 上崩溃,如何修复?

android 6+ 如何连接wii平衡板?

android - 将所有图像从 Dropbox 用户配置文件下载到 Android 手机

Android:使用 Room 和 RxJava 检查对象是否存在于数据库中

java - E/SQLite日志: (1) table keyTable has no column named number