我正在为具有多用户功能的平板电脑开发一个具有最新 android 版本(4.2.1 API-Level 17)的应用程序。
我想将某些功能(如对应用偏好的访问)限制为平板电脑的所有者(即可以添加和删除其他用户帐户的用户)
有什么办法可以找出当前用户是否是所有者?
我通读了 UserManager 和 UserHandle API 文档,但找不到允许我检查它的函数。
我错过了什么还是有其他方法可以做到这一点?
我正在为具有多用户功能的平板电脑开发一个具有最新 android 版本(4.2.1 API-Level 17)的应用程序。
我想将某些功能(如对应用偏好的访问)限制为平板电脑的所有者(即可以添加和删除其他用户帐户的用户)
有什么办法可以找出当前用户是否是所有者?
我通读了 UserManager 和 UserHandle API 文档,但找不到允许我检查它的函数。
我错过了什么还是有其他方法可以做到这一点?
类似但没有反射:
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;
}
您可以在 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/系统服务
在进一步研究之后,我发现多用户 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 它非常脏。所以我不建议使用它,除非你正在制作一个特定于设备和版本的应用程序