【问题标题】:Permission is not a changeable permission type权限不是可更改的权限类型
【发布时间】:2023-03-09 14:24:01
【问题描述】:

背景:我正在尝试新的 Tiles 和 TileService,并决定从 CyanogenMod. 重新创建 USB Tethering 磁贴我使用反射来访问连接管理器的方法。

问题:其中一种方法是isTetheringSupported(),它会导致java.lang.SecurityException: You either need MANAGE_USERS or CREATE_USERS permission to: query user

所以我在清单中添加了权限,但每次我使用 pm grant 它都会返回“权限不是可更改的权限类型”

根据this,使用调试密钥签名时我不应该收到此错误。

问题:我如何获得这些权限?

【问题讨论】:

  • 你签了吗?
  • @KhalilM 是的,我做到了

标签: java android permissions


【解决方案1】:

更新: 通过 Xposed 可以连接到 PackageManger 并删除以下检查,然后执行 pm grant... 以成功授予任何权限。如果有人看到此内容并需要帮助,请在下方评论,我会为您提供帮助。

老答案 源码中的这段代码

boolean isDevelopment =
            ((bp.protectionLevel&PermissionInfo.PROTECTION_FLAG_DEVELOPMENT) != 0);

不检查您的应用是否处于开发模式。它检查您请求的权限是否将protectionLevel 属性(在清单中设置)设置为development。 而且您尝试获得的权限似乎没有在清单中声明任何可以通过此检查的元素:

if (!isNormal && !isDangerous && !isDevelopment) {
        throw new SecurityException("Permission " + bp.name
                + " is not a changeable permission type");
    }

刚刚在另一个许可下偶然发现了这一点。可惜没有办法得到它。

【讨论】:

  • 我找不到任何关于development 保护级别的信息,但事实证明CREATE_USERSMANAGE_USERS 的保护级别设置为signature,我应该可以使用platform.x509.pemplatform.pk8 here 获取权限。 source
  • @Bhav 是的,这 2 个权限不受 development 保护,因此您无法通过 adb 访问它们,例如上面 if 语句中的检查会抛出异常。如果保护级别为signature,则只能授予您附加帖子中的权限。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-01
  • 1970-01-01
  • 2019-02-04
相关资源
最近更新 更多