¿Cómo recuperar una identificación única para identificar dispositivos Android?

Algunos desarrolladores pueden necesitar una identificación única para identificar dispositivos Android. Los casos de uso donde los desarrolladores necesitan esta ID única son múltiplos. Por ejemplo, cuando quieres:

  • identificar a un usuario de Android para almacenar puntajes de juegos en un servidor
  • rastrear la instalación de aplicaciones
  • generar DRM para protección de copia.

Existen varias soluciones pero ninguna es perfecta. En este tutorial, examinaremos cinco soluciones y presentaremos sus desventajas:

1. Número de telefonía único (IMEI, MEID, ESN, IMSI)

Si solo apunta a teléfonos inteligentes, puede aprovechar el hecho de que el dispositivo tiene servicios de telefonía. Por lo tanto, puede recuperar fácilmente una identificación única que identifica el dispositivo.

Esta identificación única puede ser IMEI, MEID, ESN o IMSI. Se pueden definir de la siguiente manera:

  • IMEI para la identidad internacional de equipos móviles: el número único para identificar teléfonos móviles GSM, WCDMA, así como algunos teléfonos satelitales
  • MEID para el identificador de equipo móvil: el número único global que identifica una pieza física del equipo de estación móvil CDMA, el MEID fue creado para reemplazar los ESN (número de serie electrónico)
  • ESN para número de serie electrónico: el número único para identificar teléfonos móviles CDMA
  • IMSI (Identidad internacional del suscriptor móvil): la identificación única asociada con todos los usuarios de teléfonos móviles de redes GSM y UMTS

Para recuperar la ID única asociada a su dispositivo, puede usar el siguiente código:

importar android.telephony.TelephonyManager;
importar android.content.Context;
// ...
TelephonyManager telephonyManager;
telephonyManager = (TelephonyManager) getSystemService (Contexto.
                    TELEPHONY_SERVICE);
/ *
* getDeviceId () devuelve la ID única del dispositivo.
* Por ejemplo, el IMEI para GSM y el MEID o ESN para teléfonos CDMA.
* /
String deviceId = telephonyManager.getDeviceId ();
/ *
* getSubscriberId () devuelve la ID de suscriptor única,
* Por ejemplo, el IMSI para un teléfono GSM.
* /
String subscriberId = telephonyManager.getSubscriberId ();

Esta solución debe solicitar android.permission.READ_PHONE_STATE a su usuario, lo que puede ser difícil de justificar según el tipo de aplicación que haya realizado.

Además, esta solución se limita a los teléfonos inteligentes porque las tabletas no tienen servicios de telefonía. Una ventaja es que el valor sobrevive al restablecimiento de fábrica en los dispositivos.

2. Dirección MAC

También puede intentar obtener una dirección MAC de un dispositivo que tenga un hardware Wi-Fi o Bluetooth. Pero, esta solución no se recomienda porque no todos los dispositivos tienen conexión Wi-Fi. Incluso si el usuario tiene una conexión Wi-Fi, debe estar activada para recuperar los datos. De lo contrario, la llamada no informa la dirección MAC.

3. Número de serie

Los dispositivos sin servicios de telefonía como tabletas deben informar una ID de dispositivo única que esté disponible a través de android.os.Build.SERIAL desde Android 2.3 Gingerbread. Algunos teléfonos que tienen servicios de telefonía también pueden definir un número de serie. Como no todos los dispositivos Android tienen un número de serie, esta solución no es confiable.

4. Identificación segura de Android

En el primer arranque del dispositivo, se genera y almacena un valor aleatorio. Este valor está disponible a través de Settings.Secure.ANDROID_ID. Es un número de 64 bits que debe permanecer constante durante la vida útil de un dispositivo. ANDROID_ID parece una buena opción para un identificador de dispositivo único porque está disponible para teléfonos inteligentes y tabletas. Para recuperar el valor, puede usar el siguiente código:

String androidId = Settings.Secure.getString (getContentResolver (),
                     Settings.Secure.ANDROID_ID);

Sin embargo, el valor puede cambiar si se realiza un restablecimiento de fábrica en el dispositivo. También hay un error conocido con un teléfono popular de un fabricante donde cada instancia tiene el mismo ANDROID_ID. Claramente, la solución no es 100% confiable.

5. Use UUID

Como el requisito para la mayoría de las aplicaciones es identificar una instalación en particular y no un dispositivo físico, una buena solución para obtener una identificación única para un usuario si utiliza la clase UUID. La siguiente solución ha sido presentada por Reto Meier de Google en una presentación de E / S de Google:

Cadena estática privada uniqueID = null;
cadena estática privada final PREF_UNIQUE_ID = "PREF_UNIQUE_ID";
ID de cadena estática pública sincronizada (contexto de contexto) {
   if (uniqueID == null) {
      SharedPreferences sharedPrefs = context.getSharedPreferences (
         PREF_UNIQUE_ID, Context.MODE_PRIVATE);
      uniqueID = sharedPrefs.getString (PREF_UNIQUE_ID, null);
      if (uniqueID == null) {
         uniqueID = UUID.randomUUID (). toString ();
         Editor editor = sharedPrefs.edit ();
         editor.putString (PREF_UNIQUE_ID, uniqueID);
         editor.commit ();
      }
   }
    return uniqueID;
}

El método UUID.randomUUID () genera un identificador único para una instalación específica. Solo tiene que almacenar ese valor y su usuario será identificado en el próximo lanzamiento de su aplicación. También puede intentar asociar esta solución con el servicio de copia de seguridad de Android para mantener la información disponible para el usuario, incluso si instala su aplicación en otro dispositivo.

Conclusión

Identificar un dispositivo en particular en Android no es algo fácil. Hay muchas buenas razones para evitar eso. La mejor solución es probablemente identificar una instalación particular mediante el uso de la solución UUID. Sin embargo, si desea identificar físicamente un dispositivo en particular, puede intentar usar la solución ANDROID_ID. No es 100% confiable pero es mejor que otras soluciones.