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

Lesezeit: 10 Minuten

Benutzer-Avatar
Ovidiu Latcu

Ich habe mir die neuen APIs angesehen, die in eingeführt wurden Android 4.2. Beim Betrachten der UserManager Klasse bin ich auf folgende Methode gestoßen:

public boolean isUserAGoat()

Wird verwendet, um festzustellen, ob der Benutzer, der diesen Anruf tätigt, Teleportationen ausgesetzt ist.

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

Wie und wann soll diese eingesetzt werden?

Benutzer-Avatar
meh

Android R-Update:

Ab Android R gibt diese Methode immer false zurück. Google sagt, dass dies getan wird, “um die Privatsphäre von Ziegen zu schützen”:

/**
 * 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>
 *
 * <p>As of {@link android.os.Build.VERSION_CODES#R}, this method always returns
 * {@code false} in order to protect goat privacy.</p>
 *
 * @return Returns whether the user making this call is a goat.
 */
public boolean isUserAGoat() {
    if (mContext.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.R) {
        return false;
    }
    return mContext.getPackageManager()
            .isPackageAvailable("com.coffeestainstudios.goatsimulator");
}

Vorherige Antwort:

Von ihren Quelledie für die 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 hätte die Methode für uns als Entwickler keinen wirklichen Nutzen. Jemand hat vorher gesagt, dass es eine sein könnte Osterei.

In API 21 wurde die Implementierung geändert, um zu prüfen, ob es eine installierte App mit dem Paket gibt 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 Quelle und die Rückgeld.

  • Theorie: Ziegen kommen an allen möglichen prekären Orten vor, wie z. B. an steilen Klippen, und widersetzen sich möglicherweise den Standorttrends, die sie von normalen Nicht-Ziegen-Nutzern erhalten. Könnte “Teleportationen” erklären, bei denen es sich um Ziegen handeln könnte, die scheinbar wild umziehen, wenn die Software versucht, ihren Standort mit Algorithmen zu bestimmen, die für Nicht-Ziegen entwickelt wurden.

    – Wender

    14. November 2012 um 12:58 Uhr

  • @ LarsH – die Quelle für eine.

    – Djechlin

    14. November 2012 um 20:07 Uhr

  • Dies ist eine Geschichtsstunde, keine Antwort. Auch wenn es sich um ein Osterei handelt, gibt es einen gültigen Anwendungsfall dafür? Ein Osterei zu sein schließt nicht aus, dass es nützlich ist, und Sie haben nicht gezeigt, ob es nützlich ist oder nicht.

    – casperOne

    14. November 2012 um 20:26 Uhr

  • Das ist ein echte Anwendung.

    – Kevin Krumwiede

    21. Februar 2015 um 8:07 Uhr

  • Ich fühle mich schlecht für jeden, der diese Funktion frech benutzt hat und erwartet, dass sie zurückkehrt false bis in alle Ewigkeit.

    – Martin Konecny

    27. April 2015 um 5:11 Uhr

Benutzer-Avatar
Djechlin

Ich weiß nicht, ob dies “der” offizielle Anwendungsfall war, aber das Folgende erzeugt eine Warnung in Java (die weitere Kompilierungsfehler verursachen kann, wenn sie mit 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");
}

Daher finde ich mich oft dabei, eine dumme Hilfsmethode zu schreiben, um einen Codeblock am schnellsten zu dummyen, und dann beim Beenden des Debuggens alle Aufrufe dafür zu finden. Vorausgesetzt, die Implementierung ändert sich nicht, kann dies dafür verwendet werden.

JLS weist darauf hin if (false) löst keinen “nicht erreichbaren Code” aus dem spezifischen Grund aus, dass dies die Unterstützung für Debug-Flags unterbrechen würde, dh im Grunde diesen Anwendungsfall (h/t @auselen). (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 lassen, aber diese Bearbeitung liegt 4 Jahre in der Zukunft, und ich habe keine Eclipse-Umgebung, mit der ich spielen könnte.

  • @djechlin Ich weiß nicht, ob dies nur Android ist, in Standard-Java lässt sich ` if (false) {…} ` problemlos kompilieren (open jdk javac 1.6 und 1.7)

    – Josefx

    14. November 2012 um 20:24 Uhr


  • @PeterOlson – Wenn Sie speziell versuchen, einen Codezweig zu testen, bei dem ein if falsch oder wahr wird, ist dies die präziseste und offensichtlichste Möglichkeit, dies zu simulieren – das Auskommentieren des Blocks könnte weniger genau sein, wenn Sie nicht mit dem richtigen übereinstimmen Ende des Blocks (vielleicht haben Sie einen diskreten if/else-Block unmittelbar danach nicht bemerkt), führt dies zu einem Kompilierungsfehler, wenn Sie Folgendes erzwingen else blockieren usw.

    – Djechlin

    15. November 2012 um 2:01 Uhr

  • „vorausgesetzt, die Umsetzung ändert sich nicht“ – und da ist das Problem. Dies ist ein desaströser Weg, um ein warnfreies “if (false)” zu implementieren, da sich die Implementierung ändern kann und dies auch tut. Siehe meine Antwort auf diese Frage: ab API21 isUserAGoat() gibt true zurück, wenn ein Benutzer eine bestimmte App installiert hat. Viel Glück bei der Diagnose, wenn sich Ihr Code plötzlich auf “zufälligen” Geräten seltsam verhält!

    – Mark Whitaker

    5. November 2014 um 12:29 Uhr

  • @MarkWhitaker Oder wenn Ziegen anfangen, Geräte zu benutzen.

    – der Tag dreht sich

    18. Februar 2016 um 1:51 Uhr

  • @thedayturns Wenn Ziegen anfangen, Android-Geräte zu verwenden, wird dies unser geringstes Problem sein.

    – Szymon Drosdzol

    29. Februar 2016 um 13:16 Uhr

Dies scheint ein Insider-Witz bei Google zu sein. Es ist auch im Task-Manager von Google Chrome enthalten. Es hat keinen Zweck, außer dass einige Ingenieure es amüsant finden. Was ein Zweck für sich ist, wenn Sie so wollen.

  1. Öffnen Sie in Chrome den Task-Manager mit Wechsel+Esc.
  2. Klicken Sie mit der rechten Maustaste, um die hinzuzufügen Goats Teleported Säule.
  3. Sich fragen.

Es gibt sogar einen riesigen Chromium-Fehlerbericht darüber zu viele teleportierte Ziegen.

Chrom

Das folgende Chromium Quellcode-Schnipsel wird gestohlen HN Kommentare.

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

  • Windows XP + neuestes Chrome = es ist nicht da, auf Ubuntu sehe ich es.

    – auselen

    14. November 2012 um 9:47 Uhr


Benutzer-Avatar
higuaro

Als Ergänzung zur @djechlin-Antwort (übrigens gute Antwort!) Könnte dieser Funktionsaufruf sein Auch Wird als Dummy-Code verwendet, um einen Haltepunkt in einer IDE zu halten, wenn Sie in einer bestimmten Iteration oder einem bestimmten rekursiven Aufruf anhalten möchten, zum Beispiel:

Geben Sie hier die Bildbeschreibung ein

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

Geben Sie hier die Bildbeschreibung ein

Google-Leute sind starke Eclipse-Benutzer (sie bieten mehrere ihrer Projekte als Eclipse-Plugins an: Android SDK, GAE usw.), daher sind die @djechlin-Antwort und diese ergänzende Antwort sehr sinnvoll (zumindest für mich).

Benutzer-Avatar
Lanze Nanek

In jeder Version von Android gibt es eine lustige benannte Methode / Konstante / was auch immer.

Die einzige praktische Verwendung, die ich je gesehen habe, war in Last Call for Google I/O Wettbewerb, bei dem sie fragten, was es für eine bestimmte Version sei, 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 eine vernünftige Menge zu reduzieren, die leichter zu überprüfen wäre.

  • „In jeder Version von Android gibt es eine komisch benannte Methode/Konstante/was auch immer.“ Können Sie einige nennen?

    – Angelo.Hannes

    15. November 2012 um 8:30 Uhr

  • Zum Beispiel gibt es ein Protokoll namens Log.wtf, das sie What a Terrible Failure 😛 nennen

    – Aracem

    15. November 2012 um 10:41 Uhr


  • Ein bisschen wie Delphis EProgrammerNotFound? stackoverflow.com/questions/2084120/…

    – Gerry Coll

    15. November 2012 um 10:52 Uhr

  • HoneyComb ist AdapterViewAnimator#fyiWillBeAdvancedByHostKThx()

    – Lanze Nanek

    15. November 2012 um 14:11 Uhr

  • @Angelo.Hannes, In den Sensorkonstanten für die Schwerkraft gibt es eine für Todesstern (Star Wars)

    – Stil

    15. November 2012 um 14:58 Uhr

Benutzer-Avatar
Peter Mortensen

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

Zum Beispiel hier auf Seite 89:

Schafe sind Menschen, bei denen die Spracherkennung außergewöhnlich gut funktioniert, und Ziegen sind Menschen, bei denen sie außergewöhnlich schlecht funktioniert. Nur der Spracherkenner weiß, was sie trennt. Menschen können nicht vorhersagen, wessen Stimme leicht erkannt wird und wessen nicht. Die beste Vorgehensweise besteht darin, die Benutzeroberfläche so zu gestalten, dass sie alle Arten von Stimmen in allen Arten von Umgebungen verarbeiten kann

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

  • „In jeder Version von Android gibt es eine komisch benannte Methode/Konstante/was auch immer.“ Können Sie einige nennen?

    – Angelo.Hannes

    15. November 2012 um 8:30 Uhr

  • Zum Beispiel gibt es ein Protokoll namens Log.wtf, das sie What a Terrible Failure 😛 nennen

    – Aracem

    15. November 2012 um 10:41 Uhr


  • Ein bisschen wie Delphis EProgrammerNotFound? stackoverflow.com/questions/2084120/…

    – Gerry Coll

    15. November 2012 um 10:52 Uhr

  • HoneyComb ist AdapterViewAnimator#fyiWillBeAdvancedByHostKThx()

    – Lanze Nanek

    15. November 2012 um 14:11 Uhr

  • @Angelo.Hannes, In den Sensorkonstanten für die Schwerkraft gibt es eine für Todesstern (Star Wars)

    – Stil

    15. November 2012 um 14:58 Uhr

Ab API 21 (das erste Android 5.0/Lollipop SDK)dies erkennt, ob die Ziegen-Simulator 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 Warnung zu verwenden, frei ist if (false) ist eine potenziell katastrophale Strategie. Was zuvor zurückgegeben false denn jedes Gerät gibt jetzt einen scheinbar zufälligen Wert zurück: Wenn dieser tief genug in Ihrem Code vergraben wäre, könnte es dauern lang Zeit herauszufinden, woher Ihre neuen Fehler kommen.

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

  • Warum sollte jemand jemals irgendeine Art von setzen if(false) in Produktion? Komm her. Wenn Ihr Code so aussieht, dann ist diese Implementierungsänderung die am wenigsten Ihrer Probleme.

    – Djechlin

    5. November 2014 um 15:56 Uhr

  • @djechlin “Brauchen wir diese Funktion? ändert sich zu if(false), Testfunktion nö. checkt ein

    – Benutzer253751

    25. September 2020 um 15:37 Uhr

1352520cookie-checkGeeignete Anwendungsfälle für Android UserManager.isUserAGoat()?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy