Вопрос: Правильные варианты использования для Android UserManager.isUserAGoat ()?


Я рассматривал новые API, представленные в Android 4.2 , Смотря на UserManagerкласс I натолкнулся на следующий метод:

 public boolean isUserAGoat()

Используется для определения того, подлежит ли пользователю этот вызов телепортации.

Возвращает, является ли пользователь, выполняющий этот вызов, козой.

Как и когда это следует использовать?


3103


источник


Ответы:


От их источник , метод, используемый для возвращения falseпока он не изменился в API 21.

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

Похоже, что этот метод не используется для нас как разработчиков. Кто-то ранее заявил, что это может быть пасхальное яйцо ,

В API 21 была изменена реализация, чтобы проверить, есть ли установленное приложение с пакетом 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");
}

Здесь ссылка источника


1487



Я не знаю, было ли это «официальным прецедентом», но следующее выдает предупреждение на Java (которое может дополнительно создавать ошибки компиляции, если они смешиваются с returnзаявления, приводящие к недостижимому коду):

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

Однако это законно:

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

Поэтому я часто нахожу, что я пишу глупый метод утилиты для самого быстрого способа заглушить блок кода, а затем, завершая отладку, нахожу все вызовы к нему, поэтому при условии, что реализация не изменится, это может быть использовано для этого.

JLS указывает на то if (false)не вызывает «недостижимый код» по той причине, что это нарушит поддержку флагов отладки, т. е. в основном этот прецедент (h / t @auselen). ( static final boolean DEBUG = false;например).

Я заменил whileдля if, создавая более неясный вариант использования. я верить вы можете отключить свою IDE, например Eclipse, с таким поведением, но это редактирование составляет 4 года в будущем, и у меня нет среды Eclipse для игры.


914



Это, похоже, внутренняя шутка в Google. Он также отображается в диспетчере задач Google Chrome. У него нет никакой цели, кроме некоторых инженеров, которые считают это забавным. Какая цель сама по себе, если хотите.

  1. В Chrome откройте диспетчер задач с помощью сдвиг + Esc ,
  2. Щелкните правой кнопкой мыши, чтобы добавить Goats Teleportedколонка.
  3. Задаваться вопросом.

Существует даже огромный отчет об ошибке Chromium о слишком много телепортированных коз ,

chrome

Следующий Хром фрагмент исходного кода украден из HN Комментарии.

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

705



В дополнение к @djechlin ответ (хороший ответ, кстати!), этот вызов функции может быть также используется как фиктивный код для хранения точки останова в среде IDE, когда вы хотите остановиться в какой-либо конкретной итерации или конкретном рекурсивном вызове, например:

enter image description here

isUserAGoat()может использоваться вместо объявления фиктивной переменной, которое будет отображаться в среде IDE в качестве предупреждения, а в частном случае Eclipse будет забивать метку точки останова, что затрудняет ее включение / отключение. Если метод используется в качестве условного обозначения, все вызовы могут быть позже отфильтрованы с помощью какого-либо скрипта (возможно, на этапе фиксации?).

enter image description here

Ребята из Google - это тяжелые пользователи Eclipse (они предоставляют несколько своих проектов как плагины Eclipse: Android SDK, GAE и т. Д.), Поэтому ответ @djechlin и этот дополнительный ответ имеют большой смысл (по крайней мере для меня).


256



В каждой версии Android есть смешной метод / constant / whatever.

Единственное практическое применение, которое я когда-либо видел, было в Last Call for Google I / O Конкурс, где они спросили, что именно для конкретной версии, посмотреть, будут ли участники читать отчет API diff для каждой версии. У конкурса были проблемы с программированием, но в целом некоторые мелочи, которые можно было автоматически оценивать автоматически, чтобы получить количество материалов до разумных сумм, которые было бы легче проверить.


122



В дисциплине распознавания речи пользователи делятся на козы а также овцы ,

Например, здесь на стр. 89 :

Овцы - это люди, для которых распознавание речи работает исключительно хорошо, а козы - люди, для которых он работает исключительно плохо. Только распознаватель голоса знает, что их разделяет. Люди не могут предсказать, чей голос будет легко распознан и чья воля не будет. Лучшая политика заключается в разработке интерфейса, чтобы он мог обрабатывать все виды голосов во всех видах среды

Возможно, в будущем планируется отметить пользователей Android как козлов, чтобы настроить механизм распознавания речи для потребностей коз. ;-)


106



Google has a serious liking for goats and goat based Easter eggs. There has even been previous Stack Overflow posts about it.

As has been mentioned in previous posts, it also exists within the Chrome task manager (it first appeared in the wild in 2009):

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

And then in Windows, Linux and Mac versions of Chrome early 2010). The number of "Goats Teleported" is in fact random:

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

Other Google references to goats include:

The earliest correlation of goats and Google belongs in the original "Mowing with goats" blog post, as far as I can tell.

We can safely assume that it's merely an Easter egg and has no real-world use, except for returning false.


104



As of API 21 (the first Android 5.0/Lollipop SDK), this detects whether the Goat Simulator app is installed:

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

This should make it clear that djechlin's suggestion of using it as a warning-free if (false) is a potentially disastrous strategy. What previously returned false for every device now returns a seemingly random value: if this was buried deep enough in your code it could take a long time to figure out where your new bugs are coming from.

Bottom line: if you don't control the implementation of a method and decide to use it for purposes other than stated in the API documentation, you're heading for trouble.


100



There is a similar call, isUserAMonkey(), that returns true if the MonkeyRunner tool is being used. The SDK explanation is just as curious as this one.

public static boolean isUserAMonkey(){}     

Returns true if the user interface is currently being messed with by a monkey.

Here is the source.

I expect that this was added in anticipation of a new SDK tool named something with a goat and will actually be functional to test for the presence of that tool.

Also see a similar question, Strange function in ActivityManager: isUserAMonkey. What does this mean, what is its use?.


93