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

我开发的应用程序与最新的Android版本(4.2.1 API-17级)的平板电脑具有多用户function。

我想限制某些function(如访问应用程序首选项)给平板电脑的所有者(即可以添加和删除其他用户帐户的用户)

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

我通过UserManager和UserHandle API文档阅读,但无法find一个函数,让我来检查它。

我错过了什么或有另一种方式来做到这一点?

类似但没有反思:

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

进一步研究后,我发现多用户API是不是function,它不能真正用于任何事情。 有一个黑客,虽然检查用户是否使用reflection的所有者:

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

您可以在Kotlin中创建一个扩展属性,使其更简单:

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

那么,使用它就像下面这样简单:

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

您可以通过使用全局系统服务定义来进一步减少样板,使userManager和其他Android系统服务在您的Kotlin代码中的任何位置都可用: https : userManager