Я хотел бы, чтобы мой код выполнялся немного иначе при работе на эмуляторе, чем при работе на устройстве. ( Например , использование 10.0.2.2 вместо общедоступного URL-адреса для автоматического запуска на сервере разработки.) Как лучше всего определить, когда приложение Android работает в эмуляторе?
android
android-emulator
Джо Людвиг
источник
источник
android.os.Build
.Ответы:
Как насчет этого решения:
Обратите внимание, что некоторые эмуляторы имитируют точные характеристики реальных устройств, поэтому может оказаться невозможным их обнаружить.
Вот небольшой фрагмент, который вы можете сделать в APK, чтобы показать различные вещи, чтобы вы могли добавить свои собственные правила:
источник
Один общий кажется
Build.FINGERPRINT.contains("generic")
источник
FINGERPRINT
значение.Ну, Android ID не работает для меня, в настоящее время я использую:
источник
Основываясь на подсказках из других ответов, это, вероятно, самый надежный способ:
isEmulator = "goldfish".equals(Build.HARDWARE)
источник
isEmulator = Build.HARDWARE.contains("golfdish")
Google использует этот код в плагине информации об устройстве от Flutter, чтобы определить, является ли устройство эмулятором:
источник
Как насчет кода ниже, чтобы узнать, подписано ли ваше приложение с помощью ключа отладки? это не обнаруживает эмулятор, но он может работать для ваших целей?
источник
BuildConfig.DEBUG
.Этот код работает для меня
Если на этом устройстве нет SIM-карты, оно возвращает пустую строку: ""
Поскольку эмулятор Android всегда переустанавливает «Android» в качестве оператора сети, я использую приведенный выше код.
источник
Я попробовал несколько методов, но остановился на немного пересмотренной версии проверки Build.PRODUCT, как показано ниже. Кажется, это может сильно отличаться от эмулятора к эмулятору, поэтому у меня есть 3 проверки, которые у меня сейчас есть. Полагаю, я мог бы просто проверить, есть ли product.contains ("sdk"), но подумал, что проверка ниже была немного безопаснее.
К вашему сведению - я обнаружил, что мой Kindle Fire имеет Build.BRAND = "generic", а на некоторых эмуляторах не было "Android" для оператора сети.
источник
Для обоих следующих параметров установлено значение "google_sdk":
Так что должно быть достаточно использовать одну из следующих строк.
или
источник
sdk_x86
.Я просто ищу
_sdk
,_sdk_
илиsdk_
, или простоsdk
участвую вBuild.PRODUCT
:источник
contains("sdk")
? Единственное отличие (кроме быстрого) состоит в том,matches(".*_?sdk_?.*")
что если перед символом sdk или после него есть символ, он должен быть подчеркиванием '_', что не так уж важно проверять.Я так и не нашел хороший способ узнать, в эмуляторе ли вы.
но если вам просто нужно определить, находитесь ли вы в среде разработки, вы можете сделать это:
Надеюсь, это поможет ....
источник
используйте эту функцию:
источник
Не знаю, есть ли лучшие способы обнаружить эму, но эмулятор будет иметь файл
init.goldfish.rc
в корневом каталоге.Это скрипт запуска, специфичный для эмулятора, и его не должно быть в сборке без эмулятора.
источник
Вот мое решение (оно работает только в том случае, если вы запускаете веб-сервер на своем компьютере для отладки): я создал фоновую задачу, которая запускается при запуске приложения. Он ищет http://10.0.2.2 и, если он существует, изменяет глобальный параметр (IsDebug) на true. Это тихий способ узнать, куда вы бежите.
из основной деятельности по созданию:
источник
От батареи эмулятор: источником питания всегда является зарядное устройство переменного тока. Температура всегда 0.
И вы можете использовать
Build.HOST
для записи значения хоста, разные эмулятор имеет разные значения хоста.источник
Я нашел новый эмулятор
Build.HARDWARE = "ranchu"
.Ссылка: https://groups.google.com/forum/#!topic/android-emulator-dev/dltBnUW_HzU
А также я нашел официальный способ Android проверить, является ли эмулятор или нет. Я думаю, что это хорошая ссылка для нас.
Надо
ScreenShapeHelper.IS_EMULATOR
проверить, есть ли эмулятор.Надо
Build.IS_EMULATOR
проверить, есть ли эмулятор.Официальный способ проверить, является ли эмулятор не новым, а также, возможно, не достаточно, ответы выше также упоминается.
Но это может показать нам, что чиновник предоставит возможность чиновнику проверить, работает ли эмулятор или нет.
Так как мы использовали все вышеперечисленные способы, прямо сейчас мы также можем использовать два способа проверки наличия эмулятора.
Как получить доступ к
com.android.internal
пакету и@hide
и ждать официального открытия SDK.
источник
Другой вариант - посмотреть на свойство ro.hardware и посмотреть, установлено ли для него значение goldfish. К сожалению, кажется, что нет простого способа сделать это из Java, но это тривиально из C с помощью property_get () .
источник
Выше предложенное решение, чтобы проверить
ANDROID_ID
работоспособность для меня, пока я не обновил сегодня до последних инструментов SDK, выпущенных с Android 2.2.Поэтому в настоящее время я переключился на следующее решение, которое до сих пор работает с недостатком, однако вам необходимо установить разрешение на чтение PHONE_STATE (
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
).источник
Все ответы в одном методе
источник
init.goldfish.rc
существует только в эмуляторах; кроме того, это хорошая проверка в дополнение к деталям сборки.Моя рекомендация:
попробуй это с github.
Легко обнаружить эмулятор Android
Как использовать с примером:
источник
Вы можете проверить IMEI #, http://developer.android.com/reference/android/telephony/TelephonyManager.html#getDeviceId%28%29
если я вызову на эмуляторе это возвращение 0. однако, я не могу найти никакой документации, которая бы это гарантировала. хотя эмулятор может не всегда возвращать 0, вполне вероятно, что зарегистрированный телефон не вернет 0. что произойдет на устройстве, не являющемся телефоном для Android, или на устройстве без установленной SIM-карты или на устройстве, которое в данный момент не зарегистрировано на сеть?
кажется, что это плохая идея, зависеть от этого.
это также означает, что вам нужно запросить разрешение на чтение состояния телефона, что плохо, если вам это не нужно для чего-то другого.
если нет, то всегда где-то щелкает, прежде чем вы, наконец, сгенерируете подписанное приложение.
источник
0
на планшет Android или на телефон без SIM-карты.Это должно вернуть true, если приложение работает на эмуляторе.
Мы должны быть осторожны, чтобы не обнаружить все эмуляторы, потому что есть только несколько разных эмуляторов. Это легко проверить. Мы должны убедиться, что фактические устройства не распознаются как эмулятор.
Я использовал приложение под названием « Android Device Info Share », чтобы проверить это.
В этом приложении вы можете видеть различную информацию о многих устройствах (возможно, о большинстве устройств в мире; если используемое вами устройство отсутствует в списке, оно будет добавлено автоматически).
источник
Проверяя ответы, ни один из них не работал при использовании эмуляторов LeapDroid, Droid4x или Andy,
Что работает для всех случаев:
источник
На самом деле, ANDROID_ID на 2.2 всегда равен 9774D56D682E549C (согласно этой теме + мои собственные эксперименты).
Итак, вы можете проверить что-то вроде этого:
Не самая красивая, но она делает свою работу.
источник
Это работает для меня
источник
Положить файл в файловую систему эмулятора; поскольку файл не существует на реальном устройстве, он должен быть стабильным, надежным и легко исправимым в случае поломки.
источник
Я собрал все ответы на этот вопрос и придумал функцию, чтобы определить, работает ли Android на виртуальной машине / эмуляторе:
Проверено на эмуляторе, Genymotion и Bluestacks (1 октября 2015 г.).
источник
Какой код вы используете , чтобы сделать обнаружение эмулятора, я настоятельно рекомендую писать юнит - тесты , чтобы охватить все
Build.FINGERPRINT
,Build.HARDWARE
иBuild.MANUFACTURER
значение , которые зависят от. Вот несколько примеров тестов:... и вот наш код (журналы отладки и комментарии удалены для краткости):
источник
Поскольку основным механизмом эмуляции для Genymotion является VirtualBox, и он не изменится в ближайшее время, я нашел следующий код наиболее надежным:
источник
Другой вариант - проверить, находитесь ли вы в режиме отладки или производственном режиме:
if (BuildConfig.DEBUG) { Log.i(TAG, "I am in debug mode"); }
просто и надежно.
Не совсем ответ на вопрос, но в большинстве случаев вы можете захотеть провести различие между сеансами отладки / тестирования и сеансами жизни вашей пользовательской базы.
В моем случае я установил для Google Analytics значение DryRun () в режиме отладки, поэтому этот подход работает для меня совершенно нормально.
Для более продвинутых пользователей есть еще один вариант. Варианты сборки Gradle:
в файле Gradle вашего приложения добавьте новый вариант:
В вашем коде проверьте тип сборки:
Теперь у вас есть возможность создать 3 разных типа вашего приложения.
источник