Модель пользователей Android и получение списка профилей

В Android каждый пользователь — изолированный профиль с уникальным UID и собственными данными. Получить список профилей можно через UserManager (userManager.userProfiles или userManager.users); для полного списка может потребоваться разрешение QUERY_ALL_USERS и проверка версии API.

Как устроена модель пользователей (user model)

  • Начиная с Android 4.2 система поддерживает несколько пользователей: Owner (владелец, UID 0), primary, secondary, guest и managed (Work Profile).
  • Каждый профиль имеет отдельное хранилище: /data/user/. Общие системные данные хранятся в /data/system/users/.
  • Переключение профиля грузит состояние нового пользователя и приостанавливает предыдущего (на слабых устройствах 5–30 с).
  • Managed profiles управляются MDM и имеют строгую изоляцию и дополнительные политики.

Для кода используйте UserHandle и методы UserManager — UID профиля фиксирован системой и не меняется.

Где находятся настройки профилей и как переключаться

  • Настройки: Настройки → Система → Пользователи и профили (на разных оболочках пункты могут отличаться).
  • Только владелец видит полный список и может добавлять/удалять профили; обычные пользователи ограничены.
  • Быстрое переключение: долгий тап на аватаре на экране блокировки или быстрый свайп шторки с выбором аватара.
  • Корпоративный профиль: настройки отображаются отдельно (Рабочий профиль / Accounts).

Начиная с Android 15+ появились дополнительные ограничения: гостям может требоваться PIN для установки приложений, владельцы видят статистику использования по профилям.

Как получить список пользователей (getUsers) — пошагово

  1. Проверьте API-уровень: многие методы стабильны с API 21+, но права и поведение менялись в Android 11+.
  2. В AndroidManifest добавьте разрешение (учтите ограничения платформы):
<uses-permission android:name="android.permission.QUERY_ALL_USERS" />
  1. В коде (Kotlin):
val userManager = context.getSystemService(Context.USER_SERVICE) as UserManager
// Профили текущего пользователя (быстро):
val profiles: List<UserInfo> = userManager.userProfiles
// Все пользователи (может требовать права и быть ограничено):
val allUsers: List<UserInfo> = userManager.users

for (u in profiles) {
    Log.d("Users", "ID: ${u.id}, name: ${u.name}, flags: ${u.flags}")
}
val currentUserId = UserHandle.myUserId()
val isOwner = userManager.isUserOwner
  1. CLI (эмулятор / устройство с поcтроенным ADB):
  • Просмотреть пользователей: adb shell pm list users
  • Открыть экран настроек пользователей: adb shell am start -a android.settings.USER_SETTINGS

В эмуляторе удобнее тестировать переключение и создание профилей через AVD и команды adb.

Частые ошибки

  • Ожидание, что userManager.users всегда вернёт всех пользователей — с Android 11+ доступ ограничен; может потребоваться системное/подписанное разрешение.
  • Попытки доступа к файлам другого профиля без INTERACT_ACROSS_USERS приведут к ошибкам доступа.
  • Удаление профиля пытаются делать из приложения без прав — только владелец/системный процесс может removeUser(userId).

FAQ

  • Нужно ли разрешение для чтения userProfiles?
    • userProfiles обычно доступен приложению для текущего пользователя; полный список users требует QUERY_ALL_USERS и может быть ограничен.
  • Как отличить managed profile от обычного?
    • Проверьте флаги UserInfo: isManaged/isGuest/flags укажут тип профиля.
  • Можно ли создать профиль из приложения?
    • Создание пользователя требует системных привилегий (CREATE_USERS) и обычно недоступно обычным приложениям.