java Geeignete Anwendungsfälle für Android UserManager.isUserAGoat()?




(8)

Ich habe mir die neuen APIs von Android 4.2 angesehen . Beim Betrachten der UserManager Klasse bin ich auf folgende Methode UserManager :

public boolean isUserAGoat()

Wird verwendet, um zu bestimmen, ob der Benutzer, der diesen Anruf tätigt, Teleportationen unterliegt.

Gibt zurück, ob der Benutzer, der diesen Aufruf durchführt, eine Ziege ist.

Wie und wann sollte dies verwendet werden?

https://code.i-harness.com


Als Ergänzung zur @djechlin- answer (übrigens gute Antwort!) Kann dieser Funktionsaufruf auch als Dummy-Code zum Halten eines Haltepunkts in einer IDE verwendet werden, wenn Sie in einer bestimmten Iteration oder einem bestimmten rekursiven Aufruf anhalten möchten, beispielsweise:

isUserAGoat() könnte anstelle einer Dummy-Variablendeklaration verwendet werden, die in der IDE als Warnung angezeigt wird, und im Eclipse-Fall wird die Haltepunktmarkierung verstopft, was das Aktivieren / Deaktivieren der Markierung erschwert. Wenn die Methode als Konvention verwendet wird, können alle Aufrufe später durch ein Skript (möglicherweise während der Festschreibungsphase?) Gefiltert werden.

Google-Jungs sind starke Eclipse-Nutzer (sie stellen mehrere ihrer Projekte als Eclipse-Plugins bereit: Android SDK, GAE usw.), sodass die @ djechlin-Antwort und diese ergänzende Antwort (zumindest für mich) sehr sinnvoll sind.


Bitte sehen Sie den folgenden Quellcode:

/**
 * Used to determine whether the user making this call is subject to
 * teleportations.
 *
 * <p>As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method can
 * now automatically identify goats using advanced goat recognition technology.</p>
 *
 * @return Returns true if the user making this call is a goat.
 */
public boolean isUserAGoat() {
    return mContext.getPackageManager()
            .isPackageAvailable("com.coffeestainstudios.goatsimulator");
}

Es gibt eine lustige benannte Methode / Konstante / was auch immer in jeder Android-Version.

Die einzige praktische Anwendung, die ich je gesehen habe, war im letzten Aufruf zum Google I / O- Wettbewerb, in dem sie gefragt wurden, was für eine bestimmte Version es ist, um zu sehen, ob die Teilnehmer den API-Diff-Bericht für jede Version lesen. Der Wettbewerb hatte auch Programmierprobleme, aber im Allgemeinen einige Kleinigkeiten, die zuerst automatisch bewertet werden konnten, um die Anzahl der Einsendungen auf vernünftige Beträge zu bringen, die einfacher zu überprüfen wären.


Es gibt einen ähnlichen Aufruf, isUserAMonkey() , der true zurückgibt, wenn das MonkeyRunner-Tool verwendet wird. Die SDK-Erklärung ist genauso merkwürdig wie diese.

public static boolean isUserAMonkey(){}     

Gibt " true wenn die Benutzeroberfläche gerade von einem Affen verwirrt wird.

Here ist die Quelle.

Ich gehe davon aus, dass dies in Erwartung eines neuen SDK Tools mit dem Namen etwas mit einer Ziege hinzugefügt wurde und tatsächlich funktionieren wird, um das Vorhandensein dieses Tools zu testen.

Siehe auch eine ähnliche Frage, Strange-Funktion in ActivityManager: isUserAMonkey. Was bedeutet das, was nutzt es? .


Ich weiß nicht, ob dies "der" offizielle Anwendungsfall war, aber der folgende Befehl erzeugt eine Warnung in Java (die zu Kompilierungsfehlern führen kann, wenn sie mit return Anweisungen gemischt wird, was zu nicht erreichbarem Code führt):

while (1 == 2) { // Note that "if" is treated differently
    System.out.println("Unreachable code");
}

Dies ist jedoch legal:

while (isUserAGoat()) {
    System.out.println("Unreachable but determined at runtime, not at compile time");
}

Daher schreibe ich oft eine dumme Hilfsmethode für den schnellsten Weg, um einen Codeblock auszublenden, und finde dann beim Beenden des Debuggens alle Aufrufe desselben, sofern sich die Implementierung nicht ändert, kann dies jedoch dafür verwendet werden.

JLS weist darauf hin, if (false) keinen "unerreichbaren Code" aus dem bestimmten Grund auslöst, aus dem die Unterstützung für Debug-Flags, dh im Wesentlichen dieser Anwendungsfall (h / t @auselen), unterbrochen würde. ( static final boolean DEBUG = false; zum Beispiel).

Ich habe while für if , wodurch ein eher obskurer Anwendungsfall entsteht. Ich glaube, Sie können mit diesem Verhalten Ihre IDE wie Eclipse auf den Kopf stellen, aber diese Bearbeitung ist 4 Jahre in der Zukunft, und ich habe keine Eclipse-Umgebung, mit der ich spielen kann.


In der Disziplin der Spracherkennung werden die Benutzer in Ziegen und Schafe unterteilt.

Zum Beispiel hier auf Seite 89 :

Schafe sind Menschen, für die die Spracherkennung außerordentlich gut funktioniert, und Ziegen sind Menschen, für die sie außergewöhnlich schlecht arbeitet. Nur der Spracherkenner weiß, was sie voneinander unterscheidet. Leute können nicht vorhersagen, wessen Stimme leicht erkannt wird und wem nicht. Die beste Richtlinie besteht darin, die Benutzeroberfläche so zu gestalten, dass sie mit allen Arten von Stimmen in allen Arten von Umgebungen umgehen kann

Möglicherweise ist geplant, Android-Benutzer in Zukunft als Ziegen zu kennzeichnen, um die Spracherkennungs-Engine für Ziegenbedürfnisse konfigurieren zu können. ;-)


Von ihrer source wurde die zurückgegebene Methode zurückgegeben, bis sie in API 21 geändert wurde.

/**
 * Used to determine whether the user making this call is subject to
 * teleportations.
 * @return whether the user making this call is a goat 
 */
public boolean isUserAGoat() {
    return false;
}

Es sieht so aus, als ob die Methode für uns als Entwickler keinen wirklichen Nutzen hat. Jemand hat zuvor erklärt, dass es ein Osterei sein könnte.

In API 21 wurde die Implementierung geändert, um zu prüfen, ob eine installierte App mit dem Paket com.coffeestainstudios.goatsimulator

/**
 * Used to determine whether the user making this call is subject to
 * teleportations.
 *
 * <p>As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method can
 * now automatically identify goats using advanced goat recognition technology.</p>
 *
 * @return Returns true if the user making this call is a goat.
 */
public boolean isUserAGoat() {
    return mContext.getPackageManager()
            .isPackageAvailable("com.coffeestainstudios.goatsimulator");
}

Hier ist der Quelllink


Ab API 21 (dem ersten Android 5.0 / Lollipop-SDK) erkennt dies, ob die Goat Simulator- App installiert ist:

/**
 * Used to determine whether the user making this call is subject to
 * teleportations.
 *
 * <p>As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method can
 * now automatically identify goats using advanced goat recognition technology.</p>
 *
 * @return Returns true if the user making this call is a goat.
 */
public boolean isUserAGoat() {
    return mContext.getPackageManager()
            .isPackageAvailable("com.coffeestainstudios.goatsimulator");
}

Dies sollte deutlich machen, dass der Vorschlag von Djechlin , es als warnungsfrei zu verwenden, if (false) eine potenziell katastrophale Strategie ist. Was zuvor für jedes Gerät als false , gibt nun einen scheinbar zufälligen Wert zurück: Wenn dieser Code tief genug in Ihrem Code verankert ist, kann es lange dauern, um herauszufinden, woher Ihre neuen Fehler kommen.

Fazit: Wenn Sie die Implementierung einer Methode nicht kontrollieren und entscheiden, sie zu anderen als den in der API-Dokumentation angegebenen Zwecken zu verwenden, suchen Sie nach Ärger.







usermanager