Android kullanıcı modeli ve profil listesinin alınması
Android'de her kullanıcı, benzersiz bir UID'ye ve kendi verilerine sahip izole bir profildir. Profil listesi UserManager (userManager.userProfiles veya userManager.users) aracılığıyla alınabilir; tam liste için QUERY_ALL_USERS izni ve API sürüm kontrolü gerekebilir.
Kullanıcı modelinin yapısı (user model)
- Android 4.2'den itibaren sistem birden fazla kullanıcıyı destekler: Owner (sahip, UID 0), primary, secondary, guest ve managed (İş Profili).
- Her profil ayrı bir depolama alanına sahiptir: /data/user/
. Ortak sistem verileri /data/system/users/ içinde saklanır. - Profil değiştirmek yeni kullanıcının durumunu yükler ve öncekini askıya alır (düşük güçlü cihazlarda 5–30 sn).
- Managed profiller MDM tarafından yönetilir ve sıkı izolasyon ile ek politikalara sahiptir.
Kodda UserHandle ve UserManager yöntemlerini kullanın — profil UID'si sistem tarafından sabitlenir ve değişmez.
Profil ayarlarının yeri ve geçiş yapma
- Ayarlar: Ayarlar → Sistem → Kullanıcılar ve profiller (farklı arayüzlerde menüler farklılık gösterebilir).
- Yalnızca sahip tam listeyi görür ve profil ekleyebilir/silebilir; normal kullanıcılar kısıtlıdır.
- Hızlı geçiş: Kilit ekranında avatara uzun basma veya bildirim çubuğundan avatar seçerek hızlı kaydırma.
- Kurumsal profil: Ayarlar ayrı görüntülenir (İş profili / Hesaplar).
Android 15+ ile birlikte ek kısıtlamalar geldi: misafirlerin uygulama yüklemesi için PIN gerekebilir, sahipler profil bazlı kullanım istatistiklerini görebilir.
Kullanıcı listesini alma (getUsers) — adım adım
- API seviyesini kontrol edin: birçok yöntem API 21+ ile kararlıdır, ancak izinler ve davranışlar Android 11+ ile değişti.
- AndroidManifest'e izin ekleyin (platform kısıtlamalarını dikkate alın):
<uses-permission android:name="android.permission.QUERY_ALL_USERS" />
- Kodda (Kotlin):
val userManager = context.getSystemService(Context.USER_SERVICE) as UserManager
// Mevcut kullanıcının profilleri (hızlı):
val profiles: List<UserInfo> = userManager.userProfiles
// Tüm kullanıcılar (izin gerektirebilir ve kısıtlı olabilir):
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 (emülatör / ADB kurulu cihaz):
- Kullanıcıları listeleme: adb shell pm list users
- Kullanıcı ayarları ekranını açma: adb shell am start -a android.settings.USER_SETTINGS
Emülatörde AVD ve adb komutları aracılığıyla profil geçişini ve oluşturmayı test etmek daha kolaydır.
Sık yapılan hatalar
- userManager.users'ın her zaman tüm kullanıcıları döndüreceği beklentisi — Android 11+ ile erişim kısıtlıdır; sistem/imzalı izin gerekebilir.
- INTERACT_ACROSS_USERS olmadan başka bir profilin dosyalarına erişmeye çalışmak erişim hatalarına yol açar.
- Profil silme işlemi yetkisiz uygulamadan yapılmaya çalışılır — yalnızca sahip/sistem işlemi removeUser(userId) yapabilir.
SSS
- userProfiles okumak için izin gerekli mi?
- userProfiles genellikle mevcut kullanıcı için uygulamaya açıktır; tam users listesi QUERY_ALL_USERS gerektirir ve kısıtlı olabilir.
- Managed profile'ı normalinden nasıl ayırt ederim?
- UserInfo bayraklarını kontrol edin: isManaged/isGuest/flags profil türünü gösterir.
- Uygulamadan profil oluşturulabilir mi?
- Kullanıcı oluşturma sistem ayrıcalıkları (CREATE_USERS) gerektirir ve genellikle normal uygulamalar için kullanılamaz.