«

»

abr 19 2013

Generar ID único en la instalación de nuestras apps

Hace poco tuve que pelearme con la generación de un ID único para el dispositivo o la instalación que estoy ejecutando de mi aplicación y tras buscar mucho por Internet encontré varias opciones pero siempre con algún inconveniente que hacía imposible su uso real.

Las distintas opciones que encontré (y sus inconvenientes) son estas:

  • IMEI: Sólo disponible en dispositivos con SIM disponible. Necesita declarar permiso en el manifest.
  • Secure.ANDROID_ID: Sólo existe desde Android 2.2 y con posibles valores duplicados entre dispositivos.
  • MAC del WiFi/BT: Sólo funciona si está activo el receptor. Necesitamos pedir permiso en el manifest.
  • Build.SERIAL: Disponible a partir de Android 2.3. Sólo obligatorio para dispositivos sin SIM.

Como podéis ver no hay nada que directamente nos identifique el dispositivo o la instalación de forma única y, por tanto, que podamos usar como ID de la misma.

Tras mucho pelearme me crucé con un snippet de código que Reto Meier indicó en el Google I/O de 2011 como mejor aproximación para obtener dicha identificación y que no tiene ninguno de los inconvenientes que sí veíamos en las opciones anteriores.

El snippet en concreto es este que os copio aquí debajo y que podéis pegar en cualquier clase de vuestro proyecto directamente ya que no necesita ningún permiso especial a declarar en el manifest y es compatible incluso con Android 1.0…

private static String uniqueID = null;
private static final String PREF_UNIQUE_ID = "PREF_UNIQUE_ID";

public synchronized static String id(Context context) {
	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;
}

Y para obtener el código desde cualquier punto de nuestro proyecto tan solo debemos llamar al método id() pasándole un objeto de tipo Context, por ejemplo:

String deviceID = id(Activity.this);

Y hasta aquí este pequeño snippet que seguro le dais un buen uso… ;)

Acerca del autor

Kix2902

Programador vocacional, geek y twittero de pro. Cofundador de @RedInput. Y sobre todo Fandroid moderado.

  • Javier

    Ese código puede generar valores duplicados en distintos dispositivos (improbable, pero posible), casi me fío más del Secure.ANDROID_ID

    • http://kix2902.es Kix2902

      Javier ten en cuenta que el ANDROID_ID dará siempre valores duplicados en Android 2.2 a no ser que el fabricante haya solucionado dicho bug… (tienes más info en este artículo del blog oficial de Android http://android-developers.blogspot.com.es/2011/03/identifying-app-installations.html)

      • phipex

        jajaja pues fácil, usan los 2 como clave, ahí si las probabilidades de tener repetidos serian CASI nulas

        • Antonio siles

          cierto tenes razon parienchi

  • http://about.me/jmpergar JMPergar

    ¿El UUID no es unico por app y dispositivo?

    • http://kix2902.es Kix2902

      Exacto, lo que hace este código es identificar una instalación de la app que lo implemente…

  • rackfa881618

    que paranoia puede causar android jejejeje que tan efectivo seria este metodo impementando el ANDROID_ID

  • Antonio siles

    Saludos, disculpen mi ignorancia el ID generado por la función que longitud máxima llegaría a tener? a lo que investigue UUID devuelve un arreglo de 128 bit eso seria 16 caracteres en hexadecimal o me equivoco???