11

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

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

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

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

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

4

3 回答 3

15

类似但没有反射:

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;
}
于 2013-03-16T10:25:36.760 回答
3

您可以在 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您的 Kotlin 代码中的任何位置都可以使用其他 Android 系统服务,代码包含在我制作的这个库中:https ://github.com/LouisCAD/Splitties/tree/master/系统服务

于 2017-11-22T11:20:13.770 回答
2

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

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

于 2013-02-07T11:36:31.340 回答