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

avatar
Ovidiu Latcu
14 ноября 2012 в 08:34
336889
11
3840

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

public boolean isUserAGoat()

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

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

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

Источник
Dorian
14 ноября 2012 в 20:53
4

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

John Isaiah Carmona
15 ноября 2012 в 04:58
14

Это может быть связано с тем, что Google использует коз в качестве косилки в своей штаб-квартире в Маунтин-Вью.

none
15 ноября 2012 в 10:21
3

гуглеры похоже, почему-то любят коз, неудивительно, что они сделали из них пасхальное яйцо. есть также серьезные (! ) инвестиции в коз: - как написано в блоге googleblog - покос с козами - козы были baaaahk <1737941994> и зарегистрированы в youtube в конце концов они родные газонокосилки, к тому же работоспособные ..

Fernando Gallego
29 марта 2013 в 22:09
22

Также есть константы силы тяжести на первой звезде смерти developer.android.com/reference/android/hardware/… и на острове телешоу Lost developer.android.com/reference / android / hardware /… конечно же числа.

Ответы (11)

avatar
meh
14 ноября 2012 в 08:40
1914

Обновление 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");
}

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

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

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

tedders
14 ноября 2012 в 12:58
110

Теория: козлов можно встретить во всевозможных опасных местах, таких как отвесные скалы, что, возможно, противоречит тенденциям локации, которые они получают от обычных пользователей, не являющихся козами. Это может объяснить «телепортацию», когда козлы могут дико перемещаться, когда программное обеспечение пытается определить их местоположение с помощью алгоритмов, разработанных для не-коз.

LarsH
14 ноября 2012 в 17:17
3

Как этот ответ добавляет что-нибудь к информации, которую уже показал вопрос?

djechlin
14 ноября 2012 в 20:07
12

@LarsH - источник для одного.

casperOne
14 ноября 2012 в 20:26
59

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

LarsH
14 ноября 2012 в 20:52
3

@djechlin, один аспект источника является информативным, и теперь, когда ответ был отредактирован, он стал гораздо более очевидным: (эта реализация) этот метод всегда возвращает false.

Thorbjørn Ravn Andersen
25 августа 2013 в 06:13
0

Метод может быть переопределен в тестовом сценарии.

Matthew Flaschen
19 февраля 2014 в 06:03
2

Это также ссылка на en.wikipedia.org/wiki/The_Men_Who_Stare_at_Goats о военном проекте США с участием коз.

logain
30 марта 2014 в 20:49
7

Функция обезьяны заключается в обнаружении инструмента отладки MonkeyRunner, как указано в другом ответе.

Jared Rummler
5 февраля 2015 в 09:25
9

Им нужно добавить canPigsFly(). while (!canPigsFly()) { /* code */ }

Kevin Krumwiede
21 февраля 2015 в 08:07
40

Это настоящее приложение.

Martin Konecny
27 апреля 2015 в 05:11
217

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

Ced
22 августа 2015 в 05:40
5

@casperOne, учитывая содержание метода, я думаю, что вариант использования довольно понятен.

raulk
14 января 2016 в 18:58
5

Забавно то, что есть приложение с таким идентификатором: play.google.com/store/apps/…. И это не бесплатно и не сделано Google!

user253751
27 сентября 2016 в 01:01
13

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

aberaud
14 октября 2020 в 00:20
2

Начиная с Android 11 (R), функция всегда снова возвращает false «для защиты конфиденциальности козла», согласно обновленной документации: developer.android.com/reference/android/os/…

avatar
Empire of E
17 ноября 2018 в 19:11
3

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

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

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

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

Ricardo A.
4 июня 2019 в 12:07
15

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

artem
17 августа 2020 в 19:41
2

В мониторе вкладок Google Chrome была колонка с пасхальным яйцом «козы телепортировались» (а isUserAGoat docs также относится к телепортации козлов. Так что это определенно внутренняя шутка.

avatar
Mark Whitaker
20 октября 2014 в 10:00
137

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

djechlin
5 ноября 2014 в 15:56
21

Зачем кому-либо запускать в производство какой-либо тип if(false)? Идите сюда. Если так выглядит ваш код, то это изменение реализации является наименьшим из ваших проблем.

user253751
25 сентября 2020 в 15:37
1

@djechlin "нужна ли нам эта функция? заменяется на if (false) , проверяет функцию нет. проверяет в "

avatar
j.c
6 февраля 2014 в 10:35
44

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

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

avatar
rainer198
31 мая 2013 в 09:33
150

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

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

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

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

avatar
higuaro
21 ноября 2012 в 16:55
306

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

enter image description here

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

enter image description here

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

Tomasz
30 апреля 2013 в 20:16
15

Если вы пишете «фиктивный» код просто для того, чтобы что-то быстро протестировать, в чем проблема с предупреждением Eclipse ?? Я думаю, что это действительно здорово, так как вы можете найти его, если забыли

higuaro
8 мая 2013 в 22:18
25

@Tomasz проблема в том, что в Eclipse предупреждающий знак загромождает точку останова, и вам нужно открыть представление точки останова, чтобы либо деактивировать, либо удалить его

Tomasz
9 мая 2013 в 01:40
4

Да, у меня есть решение. Вы можете щелкнуть правой кнопкой мыши по предупреждающему символу и выбрать «Переключить точку останова». Если следующая строка / опция включена, это означает, что точка останова создана. Я хотел сказать, что фиктивный код плохой, и это должно быть предупреждением, так что не забывайте;)

higuaro
16 мая 2013 в 14:51
10

@Tomasz Проблема с этим решением заключается в том, что вы заранее знаете, где находится точка останова, поэтому простой визуальный осмотр не позволит вам узнать, что предупреждение скрывает точку останова, хотя даже лучшее решение - использовать с ними условные точки останова. вы можете вообще забыть о фиктивном коде (и методах соглашения), но они различаются между IDE и не могут автоматически использоваться на рабочих станциях.

Bassinator
15 марта 2017 в 17:57
2

Почему бы просто не использовать пустой оператор ;? Я имею в виду, что козы явно лучше, но уже есть простой способ обойти это

luizfzs
14 июня 2017 в 16:22
0

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

Dawood ibn Kareem
15 апреля 2018 в 20:22
1

Эй, это не зря называется Eclipse! Я рекомендую изменить настройки Eclipse, чтобы рядом с точками останова отображалась небольшая вертикальная линия. Таким образом, вы можете видеть, включены они или нет, когда вы их переключаете.

Davide
20 декабря 2019 в 11:56
0

серьезно вы используете функции isUserAGoat()?

avatar
KDEx
16 ноября 2012 в 21:33
114

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

public static boolean isUserAMonkey(){}     

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

Здесь - источник.

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

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

CtrlF
28 января 2014 в 08:16
3

Я предполагаю, что это позволяет ActivityManager сообщать, был ли он вызван инструментом стресс-тестирования monkey ui, но я никогда этого не подтверждал.

avatar
rickyduck
15 ноября 2012 в 10:33
132

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

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

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

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

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

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

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

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

goat
17 сентября 2014 в 04:29
5

Также ходят слухи, что у ibm есть ссылки на козлов в различном внутреннем программном обеспечении.

avatar
Lance Nanek
14 ноября 2012 в 17:26
159

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

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

Angelo.Hannes
15 ноября 2012 в 08:30
12

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

Aracem
15 ноября 2012 в 10:41
48

Например, есть нивел журнала с именем Log.wtf, который они называют «ужасный сбой»: P

Gerry Coll
15 ноября 2012 в 10:52
8

Немного похоже на Delphi EProgrammerNotFound? coderhelper.com/questions/2084120/…

Lance Nanek
15 ноября 2012 в 14:11
12

HoneyComb - это AdapterViewAnimator # fyiWillBeAdvancedByHostKThx ()

st0le
15 ноября 2012 в 14:58
18

@ Angelo.Hannes, В константах датчика силы тяжести есть одна для Звезды Смерти (Звездные войны)

peejaybee
5 марта 2013 в 14:23
5

В 1.5 был датчик типа "Трикодер".

Emil S.
15 ноября 2018 в 16:42
2

@Aracem Это действительно полезно, а не пасхальное яйцо. Я довольно часто использовал его для ошибок, которые нарушают функциональность, но не должны происходить (например, если возникают исключения, которые я предотвращаю с помощью предыдущей проверки). Это гораздо лучшее решение, чем просто игнорировать ошибку.

avatar
djechlin
14 ноября 2012 в 14:47
1014

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

djechlin
14 ноября 2012 в 15:05
1

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

Andy
14 ноября 2012 в 18:13
2

Не лучше ли использовать директиву компилятора для условий, которые вы хотите скомпилировать?

josefx
14 ноября 2012 в 20:24
11

@djechlin Я не знаю, только ли это android, в стандартной java `if (false) {...}` компилируется нормально (откройте jdk javac 1.6 и 1.7)

djechlin
14 ноября 2012 в 20:26
2

@josefx - предупреждения компилятора и могут привести к ошибкам, если ветвь, в которой выполняется принудительный запуск кода, имеет оператор return, поскольку это создает недостижимый код. Это полезная ошибка компилятора; например если вы забудете операторы break; в переключателе и ваш случай default вызовет исключение, вы получите эту ошибку.

josefx
14 ноября 2012 в 20:36
0

@djechlin, извините, я почему-то не смог прочитать ваше первое предложение, увидев ваш пример (1 == 2) - то, что if (false) обрабатывается компилятором, является недостатком в этом случае (и мне нужно немного поспать, чтобы избежать большего эти ошибки :-)).

djechlin
15 ноября 2012 в 02:01
10

@PeterOlson - если вы специально пытаетесь протестировать ветвь кода, где if становится ложным или истинным, это наиболее точный и очевидный способ имитировать это - комментирование блока может быть менее точным, если вы не соответствуете правильному конец блока (возможно, вы не заметили сразу после него скрытый блок if / else), это приведет к ошибке компиляции, если вы принудительно перейдете к следующему блоку else и т. д.

djechlin
9 октября 2013 в 15:43
2

@Vadzim нет, компилятор обнаружит, что это всегда истинно.

Mark Whitaker
5 ноября 2014 в 12:29
179

«при условии, что реализация не изменится» - и в этом проблема. Это катастрофический способ реализовать «if (false)» без предупреждений, потому что реализация может измениться и действительно изменится. См. Мой ответ на этот вопрос: с API21 isUserAGoat() возвращает true, если у пользователя установлено определенное приложение. Удачи в диагностике, когда ваш код внезапно начинает вести себя странно на "случайных" устройствах!

thedayturns
18 февраля 2016 в 01:51
16

@MarkWhitaker Или если козы начнут пользоваться устройствами.

Szymon Drosdzol
29 февраля 2016 в 13:16
12

@thedayturns Если козы начнут использовать устройства Android, это будет наименьшей из наших проблем.

user253751
19 марта 2016 в 22:02
2

@djechlin Нет, вы действительно пробовали?

BlueWizard
15 ноября 2016 в 08:17
2

вы пробовали использовать / * и * / для комментирования кода?

avatar
user479870
14 ноября 2012 в 09:03
790

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

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

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

chrome

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

int TaskManagerModel::GetGoatsTeleported(int index) const {
  int seed = goat_salt_ * (index + 1);
  return (seed >> 16) & 255;
}
auselen
14 ноября 2012 в 09:17
25

у меня его нет, где щелкнуть правой кнопкой мыши? или для чего это используется

CocoNess
14 ноября 2012 в 09:33
0

Думаю, это зависит от версии Chrome. У меня 23.0.1271.64

user479870
14 ноября 2012 в 09:37
0

@OvidiuLatcu В только что добавленном отчете об ошибке показан снимок экрана Windows.

greenie
14 ноября 2012 в 09:38
14

@auselen Вам нужно щелкнуть правой кнопкой мыши заголовок столбца, чтобы увидеть раскрывающееся меню и добавить столбец Goats Teleported (по крайней мере, так это работает в Chrome на OS X). cl.ly/Ksbd

user479870
14 ноября 2012 в 09:39
1

@greenie: Спасибо, что добавили это. В Linux вы можете щелкнуть правой кнопкой мыши в любом месте.

auselen
14 ноября 2012 в 09:47
54

Windows XP + последняя версия Chrome = его нет, в Ubuntu я его вижу.

James Gregory
14 ноября 2012 в 10:09
1

Он есть в OSX, хотя мне пришлось щелкнуть правой кнопкой мыши по столбцам и проверить элемент Goats Teleported.

Mark Allen
15 ноября 2012 в 23:56
4

@Xeoncross Да, потому что никто никогда не вставлял пасхального яйца в программное обеспечение Windows.

NullUserException
16 ноября 2012 в 00:03
2

@pdknsk Когда ваш ответ был удален, в нем уже была последняя редакция. Я думаю, что это достойное объяснение того, что это такое, но чего не хватает, так это ответа на исходный вопрос: «Кто-нибудь знает, как и когда это следует использовать?»

CupOfTea696
20 ноября 2012 в 21:59
19

Вполне вероятно, что внутренняя шутка берет свое начало здесь: googleblog.blogspot.be/2010/04/goats-are-baaaahk.html

om252345
30 января 2014 в 18:06
1

@pdknsk goats - это те существа, которые следуют друг за другом или привыкли следовать за ведущим козлом, не задумываясь, так что в мире программирования слишком много козлов. Это могло быть чьим-то стилем @ google, чтобы так сказать. Не следуйте, не задумываясь.

Thanos
30 сентября 2019 в 06:04
0

семя из козьей соли. интересно.

David Callanan
4 января 2020 в 15:52
0

@ om252345 Я думал, что это овца, а не коза.

noob
21 июня 2020 в 17:32
1

Этот столбец больше не доступен в последних версиях Chrome (проверка в сборке Chrome 83 для macOS)