【笔记】Android 多用户模式和用户类型

简介

用户界面:System =》Multiple Users =》 开关多用户模式。

一般是不同用户模式下,有修改Settings应用配置的权限差异,因此需要通过用户类型对功能进行判断限制。

代码

通过UserManager可以获取当前用户的信息。

frameworks/base/core/java/android/os/UserManager.java

提供多种判断当前用户类型的接口

| API | Comment |
| getUserType() | 获取当前用户类型 @return the user type of the context user. |
| getUserName() | 获取当前用户名 Returns the user name of the context user. This call is only available to applications on the system image. |
| isSystemUser() | 判断是否为系统用户 Used to check if the context user is the system user. The system user is the initial user that is implicitly created on first boot and hosts most of the system services. |
| isGuestUser() | 基于上下文,判断是否为访客用户 Used to check if the context user is a guest user. A guest user may be transient. @return whether the context user is a guest user. |
| isGuestUser(@UserIdInt int userId) | 判断指定ID是否为访客用户 Checks if a user is a guest user. @return whether user is a guest user. |

isUserAdmin(@UserIdInt int userId) 判断指定指定id的用户是否为admin(admin可以不唯一) 返回user.isAdmin() @hide Returns whether the provided user is an admin user. There can be more than one admin user.
[UserManager功能接口]

源码

java 复制代码
/**
 * Manages users and user details on a multi-user system. There are two major categories of
 * users: fully customizable users with their own login, and profiles that share a workspace
 * with a related user.
 * <p>
 * Users are different from accounts, which are managed by
 * {@link AccountManager}. Each user can have their own set of accounts.
 * <p>
 * See {@link DevicePolicyManager#ACTION_PROVISION_MANAGED_PROFILE} for more on managed profiles.
 */
@SystemService(Context.USER_SERVICE)
@android.ravenwood.annotation.RavenwoodKeepPartialClass
public class UserManager {
    /**
     * @return the user type of the context user.
     * @hide
     */
    @TestApi
    @RequiresPermission(anyOf = {
            android.Manifest.permission.MANAGE_USERS,
            android.Manifest.permission.CREATE_USERS,
            android.Manifest.permission.QUERY_USERS})
    @UserHandleAware
    public @NonNull String getUserType() {
        UserInfo userInfo = getUserInfo(mUserId);
        return userInfo == null ? "" : userInfo.userType;
    }

获取用户信息的方法

代码案例:

通过系统服务获取UserManager对象,然后根据需求get信息。

java 复制代码
   //判断是否为Owner机主  
   private static boolean isAdminUser(Context context) {
        if (context == null) return false;
        final UserManager userManager = context.getSystemService(UserManager.class);
        if (userManager == null) return false;
        //获取当前用户类型 
        Log.d(TAG, "isAdminUser: Now user is " + userManager.getUserType());
        return userManager.isAdminUser();
    }

常见用户类型

常见类型是Owner,User和Guest。

| String | USER_TYPE | 用户 | 场景说明 |
| USER_TYPE_FULL_SYSTEM | android.os.usertype.full.SYSTEM | Owner,即机主,adminUser。 | User type representing a {@link UserHandle#USER_SYSTEM system} user that is a human user. This type of user cannot be created; it can only pre-exist on first boot. |
| USER_TYPE_FULL_SECONDARY | android.os.usertype.full.SECONDARY | User,非Owner(机主)用户。 | User type representing a regular non-profile non-{@link UserHandle#USER_SYSTEM system} human user. This is sometimes called an ordinary 'secondary user'. |
| USER_TYPE_FULL_GUEST | android.os.usertype.full.GUEST | Guset,访客模式 | User type representing a guest user that may be transient. |
| USER_TYPE_FULL_DEMO | android.os.usertype.full.DEMO | 怎么变成demo? | User type representing a user for demo purposes only, which can be removed at any time. |
| USER_TYPE_FULL_RESTRICTED | android.os.usertype.full.RESTRICTED | 受限用户,profile是什么? | User type representing a "restricted profile" user, which is a full user that is subject to certain restrictions from a parent user. Note, however, that it is NOT technically a profile. |
| USER_TYPE_PROFILE_MANAGED | android.os.usertype.profile.MANAGED | DPC是啥?APN里面有查询 | User type representing a managed profile, which is a profile that is to be managed by a device policy controller (DPC). The intended purpose is for work profiles, which are managed by a corporate entity. @FlaggedApi(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE) |
| USER_TYPE_PROFILE_CLONE | android.os.usertype.profile.CLONE | 克隆某用户 | User type representing a clone profile. Clone profile is a user profile type used to run second instance of an otherwise single user App (eg, messengers). Currently only the {@link android.content.pm.UserInfo#isMain()} user can have a clone profile. @FlaggedApi(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE) |
| USER_TYPE_PROFILE_PRIVATE | android.os.usertype.profile.PRIVATE | | User type representing a private profile. Private profile is a user profile that can be used as an alternative user-space to install and use sensitive apps. UI surfaces can adopt an alternative strategy to show apps belonging to this profile, in line with their sensitive nature. @FlaggedApi(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE) |
| USER_TYPE_PROFILE_TEST | android.os.usertype.profile.TEST | 测试 | User type representing a generic profile for testing purposes. Only on debuggable builds. |

USER_TYPE_PROFILE_COMMUNAL android.os.usertype.profile.COMMUNAL 多个用户共享一些资源而不共享敏感信息。 User type representing a communal profile, which is shared by all users of the device.
[多用户模式用户类型映射关系]
java 复制代码
public static final String USER_TYPE_FULL_SYSTEM = "android.os.usertype.full.SYSTEM";
public static final String USER_TYPE_FULL_SECONDARY = "android.os.usertype.full.SECONDARY";
public static final String USER_TYPE_FULL_GUEST = "android.os.usertype.full.GUEST";
public static final String USER_TYPE_FULL_DEMO = "android.os.usertype.full.DEMO";
public static final String USER_TYPE_FULL_RESTRICTED = "android.os.usertype.full.RESTRICTED";
public static final String USER_TYPE_PROFILE_MANAGED = "android.os.usertype.profile.MANAGED";
public static final String USER_TYPE_PROFILE_CLONE = "android.os.usertype.profile.CLONE";
public static final String USER_TYPE_PROFILE_PRIVATE = "android.os.usertype.profile.PRIVATE";
public static final String USER_TYPE_PROFILE_TEST = "android.os.usertype.profile.TEST";
public static final String USER_TYPE_PROFILE_COMMUNAL = "android.os.usertype.profile.COMMUNAL";
public static final String USER_TYPE_FULL_SYSTEM = "android.os.usertype.full.SYSTEM";
public static final String USER_TYPE_FULL_SECONDARY = "android.os.usertype.full.SECONDARY";
public static final String USER_TYPE_FULL_GUEST = "android.os.usertype.full.GUEST";
public static final String USER_TYPE_FULL_DEMO = "android.os.usertype.full.DEMO";
public static final String USER_TYPE_FULL_RESTRICTED = "android.os.usertype.full.RESTRICTED";
public static final String USER_TYPE_PROFILE_MANAGED = "android.os.usertype.profile.MANAGED";
public static final String USER_TYPE_PROFILE_CLONE = "android.os.usertype.profile.CLONE";
public static final String USER_TYPE_PROFILE_PRIVATE = "android.os.usertype.profile.PRIVATE";
public static final String USER_TYPE_PROFILE_TEST = "android.os.usertype.profile.TEST";
public static final String USER_TYPE_PROFILE_COMMUNAL = "android.os.usertype.profile.COMMUNAL";
public static final String USER_TYPE_SYSTEM_HEADLESS = "android.os.usertype.system.HEADLESS";
相关推荐
tongyiixiaohuang21 小时前
WMS已发货状态反写金蝶云星空:单策略实战教程
android
好的佩奇1 天前
Dart 之类修饰符
android·flutter·dart
alexhilton1 天前
用Konsist与Lint强制执行设计系统契约
android·kotlin·android jetpack
北京自在科技1 天前
谷歌安卓 Gemini 迎来界面改版,Find Hub 接入 Gemini 支持物品记忆查找
android·安卓
YB13751 天前
Jetpack Compose 动画Modifier.animateItem()
android
2401_885885041 天前
巴林语音通知接口如何对接?系统告警语音API接入教程
android·前端·网络·python·语音识别
收纳过往1 天前
数据库加索引的时机:慢查询日志说话
android·开发语言·数据库·python·低代码·rxjava
狂热开发者1 天前
车载中控要给鸿蒙用户,能不能和 Android 共用一个二维码?
android·华为·harmonyos
.Bryce.1 天前
T2-LLM评测不等于Agent评测
android·java·人工智能·后端·gpt·agent·1024程序员节
美狐美颜SDK开放平台1 天前
视频美颜SDK如何应对快速转头与大幅度面部动作?
android·人工智能·ios·音视频·直播美颜sdk·视频美颜sdk