Android UserManager:检查用户是否为所有者(admin)

时间:2013-02-07 11:00:06

标签: android android-4.2-jelly-bean

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

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

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

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

我错过了什么或者有其他办法吗?

3 个答案:

答案 0 :(得分:11)

类似但没有反思:

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

答案 1 :(得分:2)

经过进一步的研究,我发现多用户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;
    }
}

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

答案 2 :(得分: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()

您可以使用全局系统服务定义进一步减少样板,这些定义使您的Kotlin代码中的userManager和其他Android系统服务可用,我在此库中包含代码:https://github.com/LouisCAD/Splitties/tree/master/systemservices