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... ;)