Я изучал новые API, представленные в Android 4.2. При просмотре класса UserManager я обнаружил следующее метод:

public boolean isUserAGoat()

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

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

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

3853
Ovidiu Latcu 14 Ноя 2012 в 12:34

11 ответов

Лучший ответ

Обновление Android R:

В Android R этот метод всегда возвращает false. Google говорит, что это сделано "для защиты конфиденциальности козла":

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

Предыдущий ответ:

Из их source , метод, используемый для возврата 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");
}

Вот источник и изменение .

1882
Wrichik Basu 17 Дек 2020 в 16:56

Это не шутка изнутри

Видимо это всего лишь программа проверки приложений для Goat Simulator - от Coffee Stain Studios

Если у вас установлен Goat Simulator, вы козел. Если он у вас не установлен, вы не козел.

Я полагаю, что это был скорее личный эксперимент одного из разработчиков, скорее всего, чтобы найти людей с общими интересами.

5
Manaus 4 Дек 2019 в 10:49

Веселое пасхальное яйцо.
В версии Chrome для Ubuntu в диспетчере задач ( shift + esc ), щелкнув правой кнопкой мыши, вы можете добавить научно-фантастический столбец, который в итальянской версии называется «Capre Teletrasportate». (Телепортированные козы).

Забавная теория на этот счет: здесь.

44
GAMITG 21 Апр 2016 в 11:38

Есть аналогичный вызов isUserAMonkey(), который возвращает истину, если инструмент MonkeyRunner используется. Объяснение SDK столь же любопытно, как и это.

public static boolean isUserAMonkey(){}     

Возвращает true, если в пользовательский интерфейс в настоящее время вмешивается обезьяна.

Вот источник.

Я ожидаю, что это было добавлено в ожидании нового инструмента SDK, который назвал что-то с козой и будет < em> на самом деле быть работоспособным, чтобы проверить наличие этого инструмента.

Также см. Аналогичный вопрос: Странно функция в ActivityManager: isUserAMonkey. Что это значит, какова его польза? .

113
Community 23 Май 2017 в 12:26

Google очень любит козлы и козьи пасхальные яйца. Были даже предыдущие сообщения о переполнении стека об этом.

Как уже упоминалось в предыдущих сообщениях, он также существует в диспетчере задач Chrome (впервые появился в 2009 году):

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

А затем в версиях Chrome для Windows, Linux и Mac в начале 2010 г.). Количество "Телепортированных коз" на самом деле random:

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

Другие ссылки Google на коз включают:

Насколько я могу судить, самое раннее сопоставление козлов и Google относится к оригинальному сообщению в блоге «Кошение с козами».

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

132
Community 23 Май 2017 в 11:47

Как API 21 (первый Android 5.0 / Lollipop SDK), это определяет, есть ли Приложение Goat Simulator установлено:

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

Это должно дать понять, что предложение Джехлина об использовании эта стратегия без предупреждений if (false) потенциально губительна. То, что раньше возвращало false для каждого устройства, теперь возвращает кажущееся случайным значение: если это было достаточно глубоко закопано в вашем коде, может потребоваться много времени, чтобы выяснить, откуда происходят ваши новые ошибки. .

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

135
Mark Whitaker 20 Сен 2017 в 10:30

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

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

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

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

148
Peter Mortensen 12 Фев 2018 в 21:16

В каждой версии Android есть забавный именованный метод / константа / что угодно.

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

156
Lance Nanek 10 Дек 2012 в 02:46

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

enter image description here

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

enter image description here

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

302
Community 23 Май 2017 в 12:02

Я не знаю, было ли это "официальным" вариантом использования, но следующее вызывает предупреждение в 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, с которой можно было бы поиграть.

1002
Peter Mortensen 12 Фев 2018 в 21:13