权限保护级别错误?

Permissions protectionLevel wrong?

我正在尝试为 Android Marshmallow 调整我的代码。

我编写了一个函数来检查权限是否可撤销(PROTECTION_NORMALPROTECTION_SIGNATURE 在安装时被授予)。

运行 API-22,Manifest.permission.READ_PHONE_STATE returns protectionLevel=PermissionInfo.PROTECTION_DANGEROUSis what I expected.

但在 API-22 上,Manifest.permission.INSTALL_SHORTCUT 也 returns protectionLevel=PermissionInfo.PROTECTION_DANGEROUS,其中 is wrong from the documentation.

这是怎么发生的? 我的代码有什么问题:

final PermissionInfo permissionInfo = packageManager.getPermissionInfo(permission, 0);
switch (permissionInfo.protectionLevel) {
    case PermissionInfo.PROTECTION_NORMAL:
    case PermissionInfo.PROTECTION_SIGNATURE:
        return false;
    default:
        return true;
}

Manifest.permission.INSTALL_SHORTCUT also returns protectionLevel=PermissionInfo.PROTECTION_DANGEROUS

如果您使用的是您在问题中显示的代码,则不会。充其量,您的代码指示 protectionLevelnormal 还是 signature 并且没有设置其他位。

How does that happen?

protectionLevel 是位掩码。您没有正确比较位掩码。

int coreBits=info.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE;

coreBits 将是核心 PROTECTION_ 值之一。 protectionLevel 可能不会,因为可能设置了高阶位(例如,PROTECTION_FLAG_PRE23)。并且,在 Android 6.0 上,coreBits 报告说 INSTALL_SHORTCUTnormal 权限。

有关使用 PermissionInfo.PROTECTION_MASK_BASE 的演示,请参阅 this sample project