Модель пользователей 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) — пошагово
- Проверьте API-уровень: многие методы стабильны с API 21+, но права и поведение менялись в Android 11+.
- В AndroidManifest добавьте разрешение (учтите ограничения платформы):
<uses-permission android:name="android.permission.QUERY_ALL_USERS" />
- В коде (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
- 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) и обычно недоступно обычным приложениям.