Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android UserManager: Check if user is owner (admin)

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?

like image 790
x4rf41 Avatar asked Feb 07 '13 11:02

x4rf41


2 Answers

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;
}
like image 55
j.holetzeck Avatar answered Oct 14 '22 07:10

j.holetzeck


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

like image 3
Louis CAD Avatar answered Oct 14 '22 05:10

Louis CAD