Frage Angemessene Anwendungsfälle für Android UserManager.isUserAGoat ()?


Ich habe mir die neuen APIs angesehen, die in Android 4.2. Beim Betrachten der UserManager Klasse I stieß auf folgende Methode:

 public boolean isUserAGoat()

Wird verwendet, um zu bestimmen, ob der Benutzer, der diesen Anruf tätigt, teleportiert wird.

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

Wie und wann sollte dies verwendet werden?


3140
2017-11-14 08:34


Ursprung


Antworten:


Von ihren Quelle, die zur Rückgabe verwendete Methode false bis es 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 uns als Entwickler nicht wirklich nutzt. Jemand hat vorher gesagt, dass es eine sein könnte Osterei.

In API 21 wurde die Implementierung geändert, um zu überprüfen, ob eine installierte App mit dem Paket vorhanden ist 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 das Quelllink


1512
2017-11-14 08:40



Ich weiß nicht, ob dies der "offizielle" Anwendungsfall war, aber das Folgende erzeugt eine Warnung in Java (die, wenn mit gemischt, weitere Kompilierungsfehler erzeugen kann) return Anweisungen, die zu unerreichbarem Code führen):

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

So finde ich mich oft schreibe eine alberne Utility-Methode für den schnellsten Weg, um einen Code-Block zu dummy, dann im Debugging finden Sie alle Anrufe zu ihm, so vorausgesetzt, dass die Implementierung nicht ändert dies kann dafür verwendet werden.

JLS weist darauf hin if (false) löst keinen "unerreichbaren Code" aus dem spezifischen Grund aus, dass dies die Unterstützung für Debug-Flags, d. h. im Wesentlichen diesen Anwendungsfall (h / t @ auszulonen), unterbrechen würde. (static final boolean DEBUG = false; zum Beispiel).

ich ersetzte while zum if, wodurch ein obskurerer Anwendungsfall entsteht. ich glauben Sie können Ihre IDE, wie Eclipse, mit diesem Verhalten stolpern, aber diese Bearbeitung ist 4 Jahre in die Zukunft und ich habe keine Eclipse-Umgebung zum Spielen.


916
2017-11-14 14:47



Dies scheint bei Google ein Insider-Witz zu sein. Es ist auch im Google Chrome Task-Manager enthalten. Es hat keinen Zweck, abgesehen von einigen Ingenieuren, die es amüsant finden. Was ist ein Zweck für sich, wenn Sie so wollen.

  1. Öffnen Sie in Chrome den Task-Manager mit Verschiebung+Esc.
  2. Rechtsklicken, um das hinzuzufügen Goats Teleported Säule.
  3. Wunder.

Es gibt sogar einen riesigen Chrom-Bug-Bericht darüber zu viele teleportierte Ziegen.

chrome 

Das folgende Chromium Quellcode-Snippet wird aus dem gestohlen HN Bemerkungen.

int TaskManagerModel::GetGoatsTeleported(int index) const {
  int seed = goat_salt_ * (index + 1);
  return (seed >> 16) & 255;
}

706
2017-11-14 09:03



Ergänzung der @ Djechlin Antworten (gute Antwort übrigens!) könnte dieser Funktionsaufruf sein ebenfalls Wird als Dummy-Code zum Halten eines Haltepunkts in einer IDE verwendet, wenn Sie in einer bestimmten Iteration oder einem bestimmten rekursiven Aufruf anhalten möchten. Beispiel:

enter image description here

isUserAGoat() könnte anstelle einer Dummy-Variablendeklaration verwendet werden, die in der IDE als Warnung angezeigt wird und im speziellen Eclipse-Fall die Haltepunktmarke verstopft, was es schwierig macht, sie zu aktivieren / deaktivieren. Wenn die Methode als Konvention verwendet wird, könnten alle Aufrufe später durch ein Skript gefiltert werden (während der Festschreibungsphase vielleicht?).

enter image description here

Google-Leute sind starke Eclipse-Benutzer (sie stellen einige ihrer Projekte als Eclipse-Plugins zur Verfügung: Android SDK, GAE, usw.), so dass die @ djechlin-Antwort und diese ergänzende Antwort (zumindest für mich) sehr sinnvoll sind.


258
2017-11-21 16:55



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

Der einzige praktische Nutzen, den ich jemals gesehen habe, war im letzten Aufruf für Google I / O Wettbewerb, bei dem sie nach dem Inhalt einer bestimmten Version gefragt wurden, um zu sehen, ob die Teilnehmer den API-Diff-Bericht für jede Veröffentlichung lesen. Der Wettbewerb hatte auch Programmierprobleme, aber im Allgemeinen einige Kleinigkeiten, die automatisch benotet werden konnten, um die Anzahl der Einsendungen auf einen vernünftigen Wert zu reduzieren, der einfacher zu überprüfen wäre.


122
2017-11-14 17:26



In der Disziplin der Spracherkennung sind Benutzer unterteilt in Ziegen und Schafe.

Zum Beispiel hier auf Seite 89:

Schafe sind Menschen, für die die Spracherkennung außergewöhnlich gut funktioniert, und Ziegen sind Menschen, für die es außergewöhnlich schlecht funktioniert. Nur der Spracherkenner weiß, was sie voneinander trennt. Die Menschen können nicht vorhersagen, wessen Stimme leicht erkannt werden kann und wer nicht. Die beste Richtlinie besteht darin, die Schnittstelle so zu gestalten, dass sie alle Arten von Stimmen in allen möglichen Umgebungen bewältigen kann

Vielleicht ist es geplant, Android-Nutzer in Zukunft als Ziegen zu markieren, um die Spracherkennungs-Engine für die Bedürfnisse von Ziegen konfigurieren zu können. ;-)


110
2018-05-31 09:33



Google hat eine große Vorliebe für Ziegen und Ziegen Ostereier. Es gab sogar schon vorherige Stack Overflow posts darüber.

Wie bereits in früheren Beiträgen erwähnt, gibt es sie auch im Chrome-Task-Manager (es erschien erstmals 2009 in freier Wildbahn):

<message name="IDS_TASK_MANAGER_GOATS_TELEPORTED_COLUMN" desc="The goats teleported column">
    Goats Teleported
</message>

Und dann in Windows, Linux und Mac-Versionen von Chrome Anfang 2010). Die Anzahl der "Teleportierten Ziegen" ist tatsächlich zufällig:

 int TaskManagerModel::GetGoatsTeleported(int index) const {
     int seed = goat_salt_ * (index + 1);
     return (seed >> 16) & 255;
 }

Andere Google-Verweise auf Ziegen umfassen:

Die früheste Übereinstimmung von Ziegen und Google gehört, soweit ich das beurteilen kann, zum ursprünglichen Blogeintrag "Mähen mit Ziegen".

Wir können mit Sicherheit annehmen, dass es nur ein Osterei ist und keinen realen Gebrauch hat, außer für die Rückkehr false.


104
2017-11-15 10:33



Ab API 21 (das erste Android 5.0 / Lollipop SDK), erkennt dies, ob der Ziegensimulator App ist installiert:

/**
 * 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 Djechlins Vorschlag es als warnfrei zu benutzen if (false) ist eine potenziell katastrophale Strategie. Was zuvor zurückgegeben wurde false Für jedes Gerät gibt es jetzt einen scheinbar zufälligen Wert zurück: Wenn dies tief genug in Ihrem Code vergraben war, könnte es ein lange Zeit herauszufinden, woher deine neuen Bugs kommen.

Fazit: Wenn Sie die Implementierung einer Methode nicht kontrollieren und sich dafür entscheiden, sie für andere Zwecke als die in der API-Dokumentation angegebenen zu verwenden, sind Sie auf der Suche nach Problemen.


101
2017-10-20 10:00



Es gibt einen ähnlichen Anruf, isUserAMonkey(), das gibt wahr zurück, wenn der MonkeyRunner-Werkzeug wird benutzt. Die SDK-Erklärung ist genauso neugierig wie diese.

public static boolean isUserAMonkey(){}     

Kehrt zurück true wenn die Benutzeroberfläche gerade von einem Affen durcheinander gebracht wird.

Hierist die Quelle.

Ich erwarte, dass dies in Erwartung eines neuen hinzugefügt wurde SDK Werkzeug benannte etwas mit einer Ziege und einem Willen tatsächlich funktionsfähig sein, um auf das Vorhandensein dieses Werkzeugs zu testen.

Siehe auch eine ähnliche Frage, Seltsame Funktion im ActivityManager: isUserAMonkey. Was bedeutet das, was nützt es?.


94
2017-11-16 21:33



enter image description here

In den entlegensten Bergen des Planeten liegt eine fortschrittliche Ziege, die augenblicklich in der Lage ist, Telefone zu benutzen, genau wie wir Menschen!

Durchgesickertes Material: youtu.be/YJwZMUn7GdQ 

enter image description here

Google muss dies erkannt haben und beschloss, sie zu unterstützen, um an vorderster Front des technologischen Fortschritts zu bleiben.


51
2017-09-30 14:00