Android UserManager: Check if user is owner (admin)

做~自己de王妃 提交于 2019-11-29 14:53:02

问题


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 access to the app preferences) to the owner of the tablet (that is the user who can add and remove other user accounts)

is there any way i can find out if the current user is the owner?

i read through the UserManager and UserHandle API docs but couldn't find a function that allows me to check for it.

have i missed something or is there another way to do that?


回答1:


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



回答2:


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




回答3:


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



来源:https://stackoverflow.com/questions/14749504/android-usermanager-check-if-user-is-owner-admin

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!