Confusión de id de dispositivo de android

Si marco * # * # 8 2 5 5 # * # * , obtengo mi identificación de dispositivo android que comienza con android- 35c2acdd...

fuente fuente

Si utilizo Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID) el resultado comienza con a96b4b27...

Si utilizo ((TelephonyManager) Context.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId() el resultado comienza con 3538330...

¿Cuál es la diferencia entre estos ID-s? ¿Cómo puedo obtener el resultado del

* # * # 8 2 5 5 # * # * marcar?

IMEI

El IMEI es el ' MAC ' para el módulo de telefonía – el identificador único que usa el teléfono cuando se conecta a través de GSM / GPRS / HSPDA / etc. La red GSM lo usa para enrutar llamadas y datos desde el teléfono a través de la red GSM hasta la puerta de enlace a Internet (que es una red IP).

Un módulo de telefonía es un chip o placa de circuitos que maneja la red telefónica, ya sea GSM o CMDA, ya menudo tiene una ranura para una tarjeta SIM extraíble. Algunos teléfonos tienen más de un módulo de telefonía (teléfonos con doble o multi-SIM activos). Cada módulo de telefonía tiene su propio IMEI.

Los fabricantes dan a cada teléfono (estrictamente el módulo de telefonía) un IMEI único durante la fabricación. Sin embargo, el número normalmente se puede volver a escribir si tiene el software adecuado. Esto se hace a menudo después de que un teléfono ha sido robado para darle al teléfono una nueva identidad y bipass robado teléfono bloqueando el sistema.

El IMEI se puede obtener mediante programación utilizando la API TelephonyManager.getDeviceId () .

Los teléfonos CDMA tienen un ESN o MEID que son diferentes longitudes y formatos , aunque se recupera utilizando la misma API.

Los dispositivos Android sin módulos de telefonía -por ejemplo, muchas tabletas y dispositivos de TV- no tienen un IMEI . Como comentó Schlangi , algunos dispositivos que no tienen un módulo de telefonía falsifican el IMEI, por lo que la presencia de un IMEI no garantiza (siempre) que el dispositivo tenga un módulo de telefonía.

ANDROID_ID

ANDROID_ID es otro número único en el teléfono, generado automáticamente por el sistema operativo al arrancar por primera vez (hacerlo de esta manera facilita mucho la tarea de los fabricantes al eliminar un paso de la línea de producción).

ANDROID_ID puede (y cambia), por ejemplo:

Se utiliza principalmente por los desarrolladores (por ejemplo, la identificación y la conexión a dispositivos que utilizan adb )

ANDROID_ID se puede utilizar para identificar un dispositivo Android teniendo en cuenta las advertencias anteriores, lo que significa que identifica de forma exclusiva el dispositivo durante partes significativas de la vida del dispositivo, pero no se puede confiar en él.

También tenga en cuenta que hubo un error en Froyo donde muchos dispositivos se dieron el mismo ANDROID_ID. Este es el error

Otros identificadores

Hay una serie de otras cosas que se pueden utilizar para identificar el dispositivo:

  • Dirección MAC del módulo WiFi: WifiManager.getConnectionInfo () -> WifiInfo.getMacAddress () . Esto a menudo puede cambiarse en el software, pero generalmente es constante durante la vida útil del dispositivo. También sólo se puede leer si el módulo WiFi está encendido.
  • Dirección MAC del módulo BlueTooth: BluetoothAdaptor.getAddress () . Como WiFi MAC, esto a menudo puede ser cambiado en el software y puede estar apagado cuando lo necesite
  • Número de teléfono del abonado. Esto puede cambiar si el usuario solicita un nuevo número de la telco, o si el usuario cambia SIMs. Se obtiene de TelephonyManager.getLine1Number () . Esto sólo está presente para dispositivos de teléfono Android con una SIM actual instalada y un servicio de pago con una telco.
  • El SIM contiene su propio número de identificación ( IMSI ). Esto se obtiene de la API de TelephonyManager.getSubscriberId () . Obviamente la tarjeta SIM puede no estar presente en un momento específico, y cambia cuando se cambia la tarjeta SIM – y los usuarios pueden actualizar / reemplazar su tarjeta SIM manteniendo el mismo número, por lo que no puede decir que este es uno a uno para Un teléfono o usuario específico.
  • Relacionado con el IMSI es el MSISDN . Esto funciona como la identificación de una suscripción (su contrato para un número de teléfono específico con su proveedor de telefonía móvil) y por lo tanto le da al dispositivo su número de teléfono. El MSISDN puede estar asociado con varias tarjetas SIM, y por lo tanto con varios teléfonos. Viene con todas las advertencias para leer el SIM arriba. Esto puede recuperarse con TelephonyManager.getSimSerialNumber () . Gracias Schlangi por las correcciones y adiciones
  • Gingerbread y más tarde tiene android.os.Build.SERIAL que muchos fabricantes establecen (pero no todos. Bugger).

Otras notas

Necesitas permisos específicos para acceder a todas y cada una de las API, por lo que si intentas usar todas ellas, los permisos de la aplicación en Google Play se verán bastante permisivos.

Creo que este enlace explica todas las otras opciones disponibles también https://android-developers.googleblog.com/2011/03/identifying-app-installations.html

Encontrado en la web:

 private static final Uri URI = Uri.parse("content://com.google.android.gsf.gservices"); private static final String ID_KEY = "android_id"; String getAndroidId(Context ctx) { String[] params = { ID_KEY }; Cursor c = ctx.getContentResolver() .query(URI, null, null, params, null); if (!c.moveToFirst() || c.getColumnCount() < 2) return null; try { return Long.toHexString(Long.parseLong(c.getString(1))); } catch (NumberFormatException e) { return null; } } 

Añadir permiso:

 <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/> 

Sin embargo, dudo que se trate de un documento de identificación y me gustaría ser cuidadoso, porque podría no funcionar si GTalk se actualiza.

Fuente: http://blog.codepainters.com/2012/01/17/how-to-obtain-gtalk-android-id/

También vale la pena echar un vistazo a: http://www.toxicbakery.com/android-development/getting-google-auth-sub-tokens-in-your-android-applications/

Hay un cierto acercamiento para conseguir el identificador único en el teléfono androide.

  1. ID de Android Es una cadena hexadecimal de 64 bits que se genera en el primer arranque del dispositivo. Generalmente no cambiará a menos que sea restablecido de fábrica.

    Secure.getString (getContentResolver (), Secure.ANDROID_ID);

El ID de Android, considerado poco fiable porque a veces puede ser nulo. La documentación indica que "se puede cambiar con el restablecimiento de fábrica". Esta cadena también se puede modificar en un teléfono con raíz.

  String m_szAndroidID = Secure.getString(getContentResolver(), Secure.ANDROID_ID); Returns: 9774d56d682e549c . No special permissions required. 

2. La cadena WLAN MAC Address, es otro identificador único que puede utilizar como ID de dispositivo. Antes de leerlo, deberá asegurarse de que su proyecto tenga el permiso android.permission.ACCESS_WIFI_STATE o que la dirección MAC WLAN aparezca como nula.

  WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE); String m_szWLANMAC = wm.getConnectionInfo().getMacAddress(); Returns: 00:11:22:33:44:55 (not a real address since this is a custom ROM , as you can see the MAC address can easily be faked). WLAN doesn't have to be on, to read this value. 

3. La cadena de dirección MAC de BT, disponible en dispositivos Android con Bluetooth, se puede leer si su proyecto tiene el permiso android.permission.BLUETOOTH.

  BluetoothAdapter m_BluetoothAdapter = null; // Local Bluetooth adapter m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); String m_szBTMAC = m_BluetoothAdapter.getAddress(); 

Devoluciones: 43: 25: 78: 50: 93: 38. BT no tiene que estar encendido, para leerlo. 4. IMEI sólo para dispositivos Android con uso del teléfono:

  TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE); String szImei = TelephonyMgr.getDeviceId(); // Requires READ_PHONE_STATE 

Esto requiere agregar un permiso en AndroidManifest.xml, y los usuarios serán notificados al instalar su software: android.permission.READ_PHONE_STATE. El IMEI es único para tu teléfono y se ve así: 359881030314356 (a menos que tengas un dispositivo de preproducción con un IMEI inválido como 0000000000000). Para más información, consulte este enlace.

IMEI

Existe un requisito obligatorio por parte de los organismos de normalización de que los dispositivos móviles para redes públicas pueden estar identificados de manera única por el número IMEI

Es responsabilidad del fabricante establecer IMEI. En la práctica, los desarrolladores a veces ven IMEIs como 000000 … o 123456 … A veces los teléfonos con idénticos IMEI van a la producción, que por supuesto es un error que debe arreglarse …

ANDROID_ID

Un número de 64 bits (como una cadena hexadecimal) que se genera aleatoriamente en el primer arranque del dispositivo y debe permanecer constante durante toda la vida útil del dispositivo. (El valor puede cambiar si se realiza un restablecimiento de fábrica en el dispositivo.)

Parece que Android no confía en los fabricantes y proporciona una ID alternativa única.

EDITAR:

Esto es lo que obtengo (en lugar de IMEI) y el dispositivo Android que no es un teléfono:

 $ adb shell dumpsys iphonesubinfo Phone Subscriber Info: Phone Type = GSM Device ID = null 

Pienso que toda la información proporcionada arriba es bastante bien para entender los códigos.

Sin embargo, creo que todavía no se puede ver el resultado de la # # 8255 # # dial "(plz excusa si me equivocó en alguna parte en la comprensión de esto)

Supongo que la razón detrás de esto es una de las últimas correcciones de errores contra el código USSD hechas en Android. (Puede leer más sobre esto y verificar si su dispositivo está en la lista.

Por último, si sólo desea obtener el android ID de inmediato le sugiero que utilice este app-

https://play.google.com/store/apps/details?id=com.redphx.deviceid&hl=en

  • FireBase Job Dispatcher. El trabajo comienza después de 20-60 seg, incluso con Triger.Now. ¿Cómo puedo arreglarlo?
  • Botón androide con doble borde y degradado
  • Android montón 1-tipo de matriz de bytes extremadamente grande
  • Doble toque -> Zoom en Android MapView?
  • Obteniendo una Suma de SQLite en Java en Android
  • Cargador de clases personalizado para android?
  • Vista Listview de Android elimina cualquier espacio entre los elementos
  • Programación orientada a objetos android
  • Escribir y leer un archivo json en el almacenamiento interno android
  • Alineación derecha del texto en android?
  • La ejecución de instrumentación falló debido a 'java.io.FileNotFoundException'
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.