¿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 …"

Ideas de cómo saber si el emulador o el dispositivo real de código sería muy apreciado

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 puedo girar la pantalla del emulador de Android?
  • Cómo mantener el emulador de Android siempre en la parte superior de ubuntu 14.04
  • ¿Cómo puedo simular que el emulador tiene como una tarjeta SD?
  • Varios emuladores de Android
  • Obtener Nexus S Android NFC en modo de emulación de tarjeta
  • Android: guarda la imagen de la URL en la tarjeta SD
  • El emulador de Android Mac OSX se cuelga en la pantalla mostrando 'ANDROID_'
  • La instancia del emulador del pan de jengibre es mucho más lenta que Froyo y abajo. ¿Por qué?
  • Emulador para galaxia s3
  • Android Emulator congelación en la pantalla de carga
  • Hacer que el emulador de Android funcione más rápido
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.