Android UserManager: Check if user is owner (admin)

后端 未结 3 1315
刺人心
刺人心 2020-12-31 12:55

Im developing an app with the latest android version (4.2.1 API-Level 17) for tablets with multiuser capabilities.

I want to restrict certain features (like the acce

相关标签:
3条回答
  • 2020-12-31 13:17

    After researching further i found out that the multiuser api is not functional yet, it cant really be used for anything. there is a hack though for checking if the user is the owner using reflections:

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

    This works for me on the Nexus 7 and Nexus 10 with Android 4.2.1 Its very dirty. so i wouldnt recommend using it unless you are making an app thats device and version specific

    0 讨论(0)
  • 2020-12-31 13:22

    You can create an extension property in Kotlin to make it simpler:

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

    Then, using it is as simple as the following:

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

    You can further reduce boilerplate by using global system services definitions that makes userManager and other Android System Services available anywhere in your Kotlin code, with code included in this library I made: https://github.com/LouisCAD/Splitties/tree/master/systemservices

    0 讨论(0)
  • 2020-12-31 13:24

    Similar but without reflection:

    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;
    }
    
    0 讨论(0)
提交回复
热议问题