2013-02-07 126 views
6

我正在开发具有多用户功能的平板电脑的最新Android版本(4.2.1 API-17级)的应用程序。Android用户管理器:检查用户是否拥有者(管理员)

我要限制某些功能(如访问该应用偏好)到平板电脑的拥有者(即谁可以添加和删除其他用户帐户的用户)

有没有什么办法可以找到如果当前用户是业主?

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

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

回答

9

类似,但没有反映版本:

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

好........... –

+0

注:这需要minSdk 17 –

+0

OU可以通过使用全球系统服务的定义,使得userManager和其他可用的Android系统服务在科特林代码的任何地方进一步降低样板是否也可以检查为哪些用户安装了哪些应用程序? –

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

这对我的作品的的Nexus 7和Nexus 10采用Android 4.2.1 它非常脏。所以我wouldnt建议使用它,除非你正在做一个应用程序多数民众赞成装置和具体

0

可以在科特林创建一个扩展属性,使其更简单:

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() 

ÿ https://gist.github.com/LouisCAD/a7c3aabd0fa62e0c51e8fe0b53c37cbb

相关问题