java - studio - isuseragoat




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

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

public boolean isUserAGoat()

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

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

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


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

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

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

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


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

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


Из их 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");
}

Вот ссылка источника


Посмотрите приведенный ниже исходный код:

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

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

public static boolean isUserAMonkey(){}     

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

Here источник.

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

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


У Google есть серьезная симпатия к козам и козловым пасхальным яйцам . Там даже были предыдущие сообщения о переполнении стека .

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

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

А затем в Windows, Linux и Mac версии Chrome в начале 2010 года ). Количество «козлов с телепортами» на самом деле случайное :

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

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

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

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


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


Начиная с 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, вы столкнулись с проблемами.







usermanager