2010-12-09 22 views
24

Quiero probar en el emulador una aplicación que depende del identificador del dispositivo (ANDROID_ID).Identificador del dispositivo del emulador de Android

actualmente obtener identificador de dispositivo con el siguiente código:

final String deviceID = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID); 

Cuando ejecuto esto en un emulador vuelve null, que me da todo tipo de problemas. Parece que las versiones superiores de Android devuelven algo.

¿Hay alguna manera de obtener un identificador de dispositivo en el emulador de Android? ¿Estoy obteniendo la identificación del dispositivo incorrectamente?

¿Es posible establecer el identificador del dispositivo del emulador a través de la consola?

+1

Además, el ID de dispositivo para el emulador habrá todo 'de 0' – Falmarri

+0

Mi Android 4.3 x 86 emulador devuelve ahora un ANDROID_ID (287a676592dc7b0d). –

Respuesta

39

En el emulador, los valores de IMEI e IMSI son hardcoded:

2325  { "+CIMI", OPERATOR_HOME_MCCMNC "000000000", NULL }, /* request internation subscriber identification number */ 
2326  { "+CGSN", "000000000000000", NULL }, /* request model version */ 

, por lo tanto, siempre obtendrá null.

Si todavía desea utilizar estos números de identificación para su prueba y desea mantener el mismo código para el emulador y el dispositivo real, debe cambiar en el emulador de alguna manera.

Hay al menos dos maneras de cómo hacerlo:

  1. cambiar los valores en el código y volver a compilar el código para el emulador. Sin embargo, esto podría ser demasiado complicado y consumir mucho tiempo ... :-)

  2. "Hackear" el emulador binario (ya que no está ni comprimido ni encriptado - ¡puedes hacerlo!) Y modificar las cadenas (en la derecha lugar) allí mismo.

Así es como se hace:

  • copia de seguridad binario emulador (para hacer retroceder más tarde!). En Windows, el binario se puede encontrar bajo el nombre "emulator.exe", ubicado en su carpeta "\ tools" de Android.

  • abrir el binario con su editor favorito hexagonal

  • búsqueda de la cadena + CGSN seguido por un byte nulo (que debe ser seguido por 15 dígitos del número de IMEI - ver el printscreen abajo)

alt text

  • editar el número (ya sea coche Eful no cambiar el número original de los dígitos)

  • y guarde el archivo!

  • y quizás cambie/ajuste su código para usar el IMEI para su identificación (como señala Falmari), o use este truco para cambiar algunos otros valores.

+0

Creo que ya no funciona. No puedo encontrar el valor "+ CGSN" o "+ CIMI" en emulator.exe. – lamwaiman1988

+2

¡Todavía funciona! Solo tiene que buscar 'emulator-arm.exe' (o' emulator-x86.exe' si está usando la plataforma Intel). –

+0

@StanislavK esto no está funcionando – Abhishek

2

Como dice Falmarri, la Id del dispositivo será 0 en el emulador. Utilizo este método para generar un identificador de dispositivo único basado en una combinación de parámetros (parece funcionar para mí, aunque no lo he probado extensivamente, el emulador y un HTC Desire); no es mi método (no puedo recuerda dónde lo desenterré, pero la atribución es correcta)

/* 
* Creates a UUID specific to the device. There are possibly some instances where this does 
* not work e.g. in the emulator or if there is no SIM in the phone. 
*/ 
public static void setDeviceUUID(Context context) 
{ 
    final TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 

    final String tmDevice, tmSerial, androidId; 
    tmDevice = "" + tm.getDeviceId(); 
    tmSerial = "" + tm.getSimSerialNumber(); 
    androidId = "" + Secure.getString(context.getContentResolver(), Secure.ANDROID_ID); 

    deviceMobileNo = tm.getLine1Number(); 

    UUID deviceUuid = new UUID(androidId.hashCode(), ((long)tmDevice.hashCode() << 32) | tmSerial.hashCode()); 
    deviceUUID = deviceUuid.toString();  
} 

Espero que esto ayude.

0

Está bien hackear el emulador binario para poner en un valor alternativo. Sin embargo, debe comenzar con un dígito decimal porque en reference-ril.c, llama al at_send_command_numeric() para leer el valor. Creo que tiene que cambiarse a at_send_command_singleline() para admitir cadenas MEID (que normalmente son 14 dígitos hexadecimales que comienzan con 'A'). A menos que sea realmente inteligente y pueda encontrar e intercambiar las direcciones de las funciones en el binario, tendrá que compilar desde la fuente después de parchear para usar el mismo valor que tienen algunos teléfonos.

2

Si desea uuid emulador no nulo, a continuación, iniciar el emulador de la siguiente manera:

emulator -avd jbx86 -prop emu.uuid=5ec33f90-a471-11e2-9e96-0800200c9a66 
+1

Esto no hace nada por mí. – jab

Cuestiones relacionadas