¿Cómo averiguar de código si mi aplicación de Android se ejecuta en el emulador o dispositivo real?
He leído este hilo stackoverflow ya y he intentado usar el código dado en esa respuesta para averiguar si ejecuto mi código en el emulador o en un dispositivo real:
import android.content.ContentResolver; import android.provider.Settings.Secure; ... mTextView.setText(Secure.getString(getContentResolver(), Secure.ANDROID_ID));
En mi dispositivo real devuelve "2bccce3 …", sin embargo en el emulador no devuelve null, sino también una cadena "bd9f8 …"
- ¿Hay alguna diferencia entre el emulador y los simuladores?
- ¿Qué formatos de video se reproducirán en el emulador?
- Cómo aumentar el tamaño máximo heap del dispositivo virtual de Android?
- ¿Cómo puedo configurar el tamaño de la pantalla a 4'7 en el emulador bluestacks?
- Cómo reiniciar el emulador para probar ACTION_BOOT_COMPLETED?
Ideas de cómo saber si el emulador o el dispositivo real de código sería muy apreciado
- ¿Cómo puedo simular diferentes tipos de carga en un dispositivo Android?
- Android - Cómo copiar el emulador a un amigo para realizar pruebas
- desbloquear el emulador android desde la línea cmd
- ¿Cuál es el pronóstico para el soporte de dispositivos Bluetooth en el emulador?
- Utilizar una imagen de emulador de Android en varias máquinas
- "Esperando que el dispositivo de destino se conecte" en Android Studio 2.3
- ¿Puede el emulador de Android grabar y reproducir audio utilizando hardware de PC?
- Arranque el núcleo de Android en un entorno emulado en el dispositivo
Hay un hilo bastante antiguo en el grupo de desarrolladores de Android que sugiere comprobar el número de sensores en el dispositivo. Algo como esto podría funcionar:
SensorManager manager = (SensorManager) getSystemService(SENSOR_SERVICE); if (manager.getSensorList(Sensor.TYPE_ALL).isEmpty()) { // running on an emulator } else { // running on a device }
No he probado esto, así que no tengo ni idea de lo fiable que es la sugerencia. (Tal vez algunos emuladores ahora informan de algunos sensores, tal vez algunos dispositivos no informan de sensores. [¿Hay un cepillo de dientes Android todavía?]) Pero no puede ser peor que la comprobación de un ANDROID_ID nulo (que no funciona a partir de 2.2).
PS Otro hilo afirma que a partir de 2.2, el ANDROID_ID para el emulador es siempre "9774D56D682E549C". Sin embargo, aparentemente recibes otra cadena hexadecimal, así que tampoco creo que esto sea correcto.
PPS Otras sugerencias No he probado están aquí . Uno que parece particularmente agradable (si funciona) es:
if (android.os.Build.MODEL.equals(“google_sdk”)) { // emulator } else { //not emulator }
Esto debería hacerlo:
boolean inEmulator = false; String brand = Build.BRAND; if (brand.compareTo("generic") == 0) { inEmulator = true; }
EDITAR:
boolean inEmulator = "generic".equals(Build.BRAND.toLowerCase());
Con el advenimiento del nuevo emulador nativo de Intel los métodos arriba mencionados no trabajaron más. Ahora estoy usando este fragmento de código que funciona en los emuladores de Intel y ARM:
if (Build.MODEL.contains("google_sdk") || Build.MODEL.contains("Emulator") || Build.MODEL.contains("Android SDK")) { RunsInEmulator = true; }
¿Qué tal esta solución:
public static boolean isRunningOnEmulator() { boolean result=// Build.FINGERPRINT.startsWith("generic")// ||Build.FINGERPRINT.startsWith("unknown")// ||Build.MODEL.contains("google_sdk")// ||Build.MODEL.contains("Emulator")// ||Build.MODEL.contains("Android SDK built for x86"); if(result) return true; result|=Build.BRAND.startsWith("generic")&&Build.DEVICE.startsWith("generic"); if(result) return true; result|="google_sdk".equals(Build.PRODUCT); return result; }
Creo que la mejor respuesta es decidir por qué realmente le interesa saber – y, a continuación, compruebe la característica específica del emulador que cree que requiere que su aplicación se comporte de manera diferente que en un dispositivo.
Como se indica en este post , IMEI y IMSI se harcoded en el emulador:
2325 { "+CIMI", OPERATOR_HOME_MCCMNC "000000000", NULL }, /* request internation subscriber identification number */ 2326 { "+CGSN", "000000000000000", NULL }, /* request model version */
Puede obtener fácilmente el valor utilizando
adb shell dumpsys iphonesubinfo
Así que comprobar el IMEI del dispositivo con TelephonyManager.getDeviceId () debería ser suficiente para averiguar, si usted está en un emulador o un dispositivo real.
Para estar absolutamente seguro, usted puede combinarlo con la comprobación del nombre del modelo según lo indicado por los varios otros postes.
public static boolean isRunningOnEmulator(final Context inContext) { final TelephonyManager theTelephonyManager = (TelephonyManager)inContext.getSystemService(Context.TELEPHONY_SERVICE); final boolean hasEmulatorImei = theTelephonyManager.getDeviceId().equals("000000000000000"); final boolean hasEmulatorModelName = Build.MODEL.contains("google_sdk") || Build.MODEL.contains("Emulator") || Build.MODEL.contains("Android SDK"); return hasEmulatorImei || hasEmulatorModelName; }
La desventaja de este enfoque es que se necesita un contexto para acceder a esta información e instanciar un TelephonyManager para cada comprobación.
El siguiente es detectar correctamente mi emulador
if (Build.BRAND.equalsIgnoreCase("generic")) { //"YES, I am an emulator" } else { //"NO, I am NOT an emulator" }
- Cómo borrar ImageView correctamente?
- Usa micrófono en varias aplicaciones simultáneamente en Android