2013-02-07 3 views
6

Im Entwickeln einer App mit der neuesten Android-Version (4.2.1 API-Level 17) für Tablets mit Multiuser-Funktionen.Android UserManager: Überprüfen, ob der Benutzer Eigentümer ist (Admin)

möchte ich bestimmte Funktionen beschränken (wie der Zugang zu den App-Einstellungen) an den Besitzer der Tablette (dh der Benutzer, hinzufügen und andere Benutzerkonten entfernen)

gibt es eine Möglichkeit, die ich finden kann aus, wenn der aktuelle Benutzer der Besitzer ist?

Ich habe die UserManager- und UserHandle-API-Dokumentation gelesen, konnte aber keine Funktion finden, die es mir erlaubt, nach ihr zu suchen.

habe ich etwas verpasst oder gibt es einen anderen Weg das zu tun?

Antwort

9

ähnlich, aber ohne Reflexion:

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; 
} 
+0

Gut ........... –

+0

Hinweis: Dies erfordert minSdk 17 –

+0

Ist es auch möglich zu überprüfen, welche Apps für welche Benutzer installiert sind? –

2

Nach weiteren Recherchen fand ich heraus, dass die Multiuser API noch nicht funktionstüchtig ist, sie kann wirklich nicht für irgendetwas verwendet werden. es ist ein Hack allerdings zu prüfen, ob der Benutzer der Eigentümer Reflexionen verwendet, ist:

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; 
    } 
} 

Das ist für mich auf dem Nexus 7 und Nexus arbeitet 10 mit Android 4.2.1 Es ist sehr schmutzig. so würde ich nicht verwende es empfehlen, wenn Sie ein App, das ist Gerät machen und versionsspezifische

0

Sie können eine Erweiterungseigenschaft in Kotlin erstellen, um es einfacher zu machen:

val UserManager.isCurrentUserDeviceOwner: Boolean 
    get() = if (SDK_INT >= M) isSystemUser 
    else if (SDK_INT >= 17) getSerialNumberForUser(Process.myUserHandle()) == 0L 
    else true 

Dann ist es unter Verwendung ist so einfach wie die folgenden:

val userManager = context.getSystemService(Context.USER_SERVICE) 
if (userManager.isCurrentUserDeviceOwner) TODO() else TODO() 

Y ou kann weiter vorformulierten reduzieren, indem globale Systemdienste Definitionen verwenden, userManager und andere Android-System Service verfügbar überall in Ihrem Kotlin Code macht: https://gist.github.com/LouisCAD/a7c3aabd0fa62e0c51e8fe0b53c37cbb