Me gustaría que mi código se ejecute de manera ligeramente diferente cuando se ejecute en el emulador que cuando se ejecute en un dispositivo. ( Por ejemplo , usando 10.0.2.2 en lugar de una URL pública para ejecutar automáticamente en un servidor de desarrollo). ¿Cuál es la mejor manera de detectar cuándo una aplicación de Android se ejecuta en el emulador?
android
android-emulator
Joe Ludwig
fuente
fuente
android.os.Build
.Respuestas:
¿Qué tal esta solución?
Tenga en cuenta que algunos emuladores falsifican especificaciones exactas de dispositivos reales, por lo que puede ser imposible detectarlo.
Aquí hay un pequeño fragmento que puede hacer en el APK para mostrar varias cosas al respecto, para que pueda agregar sus propias reglas:
fuente
Uno común parece ser
Build.FINGERPRINT.contains("generic")
fuente
FINGERPRINT
valor.Bueno, la identificación de Android no funciona para mí, actualmente estoy usando:
fuente
Según las sugerencias de otras respuestas, esta es probablemente la forma más sólida:
isEmulator = "goldfish".equals(Build.HARDWARE)
fuente
isEmulator = Build.HARDWARE.contains("golfdish")
Google usa este código en el complemento de información del dispositivo de Flutter para determinar si el dispositivo es un emulador:
fuente
¿Qué tal algo como el siguiente código para saber si su aplicación se firmó con la clave de depuración? no detecta el emulador pero podría funcionar para tu propósito?
fuente
BuildConfig.DEBUG
.Este código me funciona
En caso de que el dispositivo no tenga tarjeta SIM, vuelve a ejecutar la cadena vacía: ""
Como el emulador de Android siempre vuelve a ejecutar "Android" como operador de red, utilizo el código anterior.
fuente
Probé varias técnicas, pero me decidí por una versión ligeramente revisada de comprobar Build.PRODUCT como se muestra a continuación. Esto parece variar bastante de un emulador a otro, por eso tengo las 3 comprobaciones que tengo actualmente. Supongo que podría haber verificado si product.contains ("sdk"), pero pensé que la comprobación a continuación era un poco más segura.
FYI: descubrí que mi Kindle Fire tenía Build.BRAND = "genérico", y algunos de los emuladores no tenían "Android" para el operador de red.
fuente
Tanto lo siguiente se establece en "google_sdk":
Por lo tanto, debería ser suficiente para usar cualquiera de las siguientes líneas.
o
fuente
sdk_x86
.Solo busco
_sdk
,_sdk_
osdk_
, o incluso solosdk
participoBuild.PRODUCT
:fuente
contains("sdk")
? La única diferencia (además de ser más rápido) es quematches(".*_?sdk_?.*")
requiere que si hay un carácter antes o después de sdk, debe ser un guión bajo '_', que no es tan importante verificar.Nunca encontré una buena manera de saber si estás en el emulador.
pero si solo necesita detectar si está en un entorno de desarrollo, puede hacer esto:
Espero que esto ayude....
fuente
usa esta función:
fuente
No sé si hay mejores formas de detectar el emu, pero el emulador tendrá el archivo
init.goldfish.rc
en el directorio raíz.Es el script de inicio específico del emulador, y no debería estar allí en una compilación que no sea un emulador.
fuente
Aquí está mi solución (funciona solo si ejecuta un servidor web en su máquina de depuración): he creado una tarea en segundo plano que se inicia cuando se inicia la aplicación. Busca http://10.0.2.2 y, si existe, cambia un parámetro global (IsDebug) a verdadero. Es una forma silenciosa de averiguar dónde está corriendo.
de la actividad principal en Crear:
fuente
Desde la batería, el emulador: la fuente de alimentación es siempre un cargador de CA. La temperatura siempre es 0.
Y puede usar
Build.HOST
para registrar el valor del host, un emulador diferente tiene un valor de host diferente.fuente
Encontré el nuevo emulador
Build.HARDWARE = "ranchu"
.Referencia: https://groups.google.com/forum/#!topic/android-emulator-dev/dltBnUW_HzU
Y también encontré la forma oficial de Android de verificar si el emulador o no. Creo que es una buena referencia para nosotros.
Tenemos
ScreenShapeHelper.IS_EMULATOR
que verificar si el emulador.Tenemos
Build.IS_EMULATOR
que verificar si el emulador.La forma en que el oficial verifica si el emulador no es nuevo, y tal vez tampoco sea suficiente, también se mencionan las respuestas anteriores.
Pero esto quizás nos muestre que el oficial proporcionará la forma de verificar si el emulador es o no.
Al usar las formas mencionadas anteriormente, en este momento también podemos usar las dos formas para verificar si el emulador.
Cómo acceder al
com.android.internal
paquete y@hide
y espere el SDK abierto oficial.
fuente
Otra opción sería mirar la propiedad ro.hardware y ver si está establecida en goldfish. Desafortunadamente, no parece haber una manera fácil de hacer esto desde Java, pero es trivial desde C usando property_get () .
fuente
La solución sugerida anteriormente para verificar si
ANDROID_ID
funcionó para mí hasta que actualicé hoy a las últimas herramientas SDK lanzadas con Android 2.2.Por lo tanto, actualmente cambié a la siguiente solución que funciona hasta ahora con la desventaja de que debes poner el permiso de lectura PHONE_STATE (
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
)fuente
Todas las respuestas en un solo método.
fuente
init.goldfish.rc
solo existe en emuladores; Además, es un buen control en el futuro, además de los detalles de construcción.Mi recomendación:
prueba esto desde github.
Emulador de Android fácil de detectar
Cómo usar con un ejemplo:
fuente
puede consultar el IMEI #, http://developer.android.com/reference/android/telephony/TelephonyManager.html#getDeviceId%28%29
Si recuerdo en el emulador este retorno 0. Sin embargo, no hay documentación que pueda encontrar que lo garantice. aunque el emulador no siempre devuelve 0, parece bastante seguro que un teléfono registrado no devuelva 0. lo que sucedería en un dispositivo Android que no sea un teléfono, o uno sin una tarjeta SIM instalada o una que no esté registrada actualmente en el ¿red?
Parece que sería una mala idea depender de eso.
también significa que necesitará pedir permiso para leer el estado del teléfono, lo cual es malo si no lo necesita para otra cosa.
si no es así, siempre hay algún cambio antes de que finalmente genere su aplicación firmada.
fuente
0
en una tableta Android o en un teléfono sin tarjeta SIM.Esto debería volver verdadero si la aplicación se ejecuta en un emulador.
Lo que debemos tener cuidado es no detectar todos los emuladores porque solo hay varios emuladores diferentes. Es fácil de verificar. Tenemos que asegurarnos de que los dispositivos reales no se detecten como un emulador.
Utilicé la aplicación llamada " Compartir información del dispositivo Android " para verificar esto.
En esta aplicación, puede ver varios tipos de información de muchos dispositivos (probablemente la mayoría de los dispositivos en el mundo; si el dispositivo que está utilizando falta en la lista, se agregará automáticamente).
fuente
Comprobando las respuestas, ninguna de ellas funcionó al usar emuladores LeapDroid, Droid4x o Andy,
Lo que funciona para todos los casos es lo siguiente:
fuente
En realidad, ANDROID_ID en 2.2 siempre es igual a 9774D56D682E549C (de acuerdo con este hilo + mis propios experimentos).
Entonces, podría verificar algo como esto:
No es el más bonito, pero hace el trabajo.
fuente
Esto funciona para mi
fuente
Poner un archivo en el sistema de archivos del emulador; Como el archivo no existirá en el dispositivo real, debería ser estable, confiable y fácil de arreglar cuando se rompa.
fuente
He recopilado todas las respuestas a esta pregunta y se me ocurrió una función para detectar si Android se está ejecutando en un vm / emulador:
Probado en Emulator, Genymotion y Bluestacks (1 de octubre de 2015).
fuente
Cualquiera que sea el código que se utiliza para realizar la detección de emulador, lo recomiendo mucho las pruebas de unidad de escritura para cubrir todo el
Build.FINGERPRINT
,Build.HARDWARE
yBuild.MANUFACTURER
los valores que están en función de. Aquí hay algunos ejemplos de pruebas:... y aquí está nuestro código (registros de depuración y comentarios eliminados por concisión):
fuente
Como el motor de emulación subyacente para Genymotion es VirtualBox y eso no va a cambiar en el corto plazo, el siguiente código me pareció el más confiable:
fuente
Otra opción es verificar si está en modo de depuración o en modo de producción:
if (BuildConfig.DEBUG) { Log.i(TAG, "I am in debug mode"); }
Simple y confiable.
No es totalmente la respuesta de la pregunta, pero en la mayoría de los casos es posible que desee distinguir entre sesiones de depuración / prueba y sesiones de vida de su base de usuarios.
En mi caso, configuré google analytics en dryRun () cuando estaba en modo de depuración, por lo que este enfoque funciona totalmente bien para mí.
Para usuarios más avanzados hay otra opción. variantes de construcción de gradle:
en el archivo gradle de su aplicación, agregue una nueva variante:
En su código verifique el tipo de compilación:
Ahora tienes la oportunidad de crear 3 tipos diferentes de tu aplicación.
fuente