我正在尝试修改我的android棉花糖代码。
我编写了一个函数来检查权限是否可撤销(PROTECTION_NORMALPROTECTION_SIGNATURE在安装时被授予)。
在api-22上运行,Manifest.permission.READ_PHONE_STATE返回protectionLevel=PermissionInfo.PROTECTION_DANGEROUS,它is what I expected
但在api-22上,Manifest.permission.INSTALL_SHORTCUT也返回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还返回protectionlevel=permissioninfo.protection_dangerous
如果你使用的是你在问题中显示的代码,就不会。充其量,您的代码指示protectionLevelnormal还是signature并且没有设置其他位。
怎么会这样?
protectionLevel是位掩码。您没有正确比较位掩码。

int coreBits=info.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE;

coreBits将是核心值之一。PROTECTION_可能不存在,因为可能设置了高阶位(例如,protectionLevel)。而且,在android 6.0上,PROTECTION_FLAG_PRE23报告coreBits是一个INSTALL_SHORTCUT权限。
有关使用normal的演示,请参见this sample project

09-12 17:45