【问题标题】:Android UserManager: Check if user is owner (admin)Android UserManager:检查用户是否是所有者(管理员)
【发布时间】:2013-01-22 20:34:38
【问题描述】:

我正在为具有多用户功能的平板电脑开发一个具有最新 android 版本(4.2.1 API-Level 17)的应用。

我想将某些功能(例如对应用偏好的访问)限制为平板电脑的所有者(即可以添加和删除其他用户帐户的用户)

有什么方法可以查出当前用户是否是所有者?

我通读了 UserManager 和 UserHandle API 文档,但找不到允许我检查它的函数。

我错过了什么还是有其他方法可以做到这一点?

【问题讨论】:

    标签: android android-4.2-jelly-bean


    【解决方案1】:

    类似但没有反思:

    static boolean isAdminUser(Context context)
    {
        UserHandle uh = Process.myUserHandle();
        UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);
        if(null != um)
        {
            long userSerialNumber = um.getSerialNumberForUser(uh);
            Log.d(TAG, "userSerialNumber = " + userSerialNumber);
            return 0 == userSerialNumber;
        }
        else
            return false;
    }
    

    【讨论】:

    • 注意:这需要 minSdk 17
    • 是否也可以查看为哪些用户安装了哪些应用?
    • @JosephJohnson 这个Process.myUserHandle(); 中的myUserHandle 是什么?
    【解决方案2】:

    您可以在 Kotlin 中创建一个扩展属性以使其更简单:

    val UserManager.isCurrentUserDeviceOwner: Boolean
        get() = if (SDK_INT >= 23) isSystemUser
        else if (SDK_INT >= 17) getSerialNumberForUser(Process.myUserHandle()) == 0L
        else true
    

    那么,使用起来就这么简单:

    val userManager = context.getSystemService(Context.USER_SERVICE) as UserManager
    if (userManager.isCurrentUserDeviceOwner) TODO() else TODO()
    

    您可以通过使用全局系统服务定义来进一步减少样板文件,使 userManager 和其他 Android 系统服务在您的 Kotlin 代码中的任何位置都可用,代码包含在我制作的这个库中:https://github.com/LouisCAD/Splitties/tree/master/systemservices

    【讨论】:

      【解决方案3】:

      进一步研究后,我发现多用户 api 还没有功能,它真的不能用于任何事情。虽然有一个技巧可以使用反射检查用户是否是所有者:

      public boolean isCurrentUserOwner(Context context)
      {
          try
          {
              Method getUserHandle = UserManager.class.getMethod("getUserHandle");
              int userHandle = (Integer) getUserHandle.invoke(context.getSystemService(Context.USER_SERVICE));
              return userHandle == 0;
          }
          catch (Exception ex)
          {
              return false;
          }
      }
      

      这适用于我在 Nexus 7 和 Nexus 10 上运行 Android 4.2.1 它很脏。所以我不推荐使用它,除非你正在制作一个特定于设备和版本的应用程序

      【讨论】:

        猜你喜欢
        • 2018-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-02
        相关资源
        最近更新 更多