Creación de un identificador exclusivo para Android

Cuando estoy hablando de identificación única de Android, estoy seguro de que todo el mundo ha visto esto , sin embargo también estoy tratando de llegar a una solución para identificar de forma única cualquier dispositivo de Android. Me encantaría usar una clase publicamente liberada pero aún no he encontrado una.

En mi situación, el requisito es poder identificar de forma exclusiva cualquier dispositivo que tenga alguna forma de conexión a Internet (como GPRS o Wi-Fi) y ejecutarse en el nivel 8 de API (v2.2 Froyo). No estoy al tanto de los dispositivos que no tienen Wi-Fi o una tarjeta SIM, así que hágamelo saber si hay alguna!

Hemos solucionado este problema en iOS mediante el uso de un hash de la dirección Wi-Fi mac como todos los dispositivos iOS debe tener esto. Sin embargo, para Android, las técnicas (como las respuestas a la publicación SO mencionada anteriormente) se refieren a la clase TelephonyManager que puede devolver null (como cuando el dispositivo no tiene una conexión SIM, como con Nexus 7) o getContext().getContentResolver(), Secure.ANDROID_ID que según aquí no es 100% fiable en las versiones anteriores a Froyo (que es afortunado para mí). Sin embargo, no hay ningún problema post-Froyo por lo que de nuevo, si hay alguno, házmelo saber! También he leído esto puede devolver null . Según aquí puede cambiar en un restablecimiento de fábrica, pero eso no es una preocupación importante.

Así que reunir esto para generar un GUID hopefully único: [ Este método no está completo! ]

 public static String GetDeviceId(Context context) { // Custom String Hash 1 StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("someRandomData"); // Not really needed, but means the stringBuilders value won't ever be null // TM Device String final TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); String tmDeviceId = tm.getDeviceId(); // Could well be set to null! LogMsg.Tmp("TM Device String [" + tmDeviceId + "]"); // Custom String Hash 2 stringBuilder.append(tmDeviceId); int customHash = stringBuilder.toString().hashCode(); LogMsg.Tmp("Custom String hash [" + customHash + "]"); // Device ID String String androidIDString = android.provider.Settings.Secure.getString(context.getContentResolver(), android.provider.Settings.Secure.ANDROID_ID); LogMsg.Tmp("Device ID String [" + androidIDString + "]"); // Combined hashes as GUID UUID deviceUuid = new UUID(androidIDString.hashCode(), ((long)customHash << 32)); LogMsg.Tmp("Combined hashes as GUID [" + deviceUuid.toString() + "]"); return deviceUuid.toString(); } 

Así que puede encontrar tmDeviceId se establece en null , en este caso, el customHash será el mismo independientemente del dispositivo, pero esto combinado con androidIDString debe ser globalmente único. Creo. Obviamente necesitaré resolver si tmDeviceId Y androidIDString no están disponibles y lanzar una excepción allí.

Así que … ¿esto es excesivo? Si es así, ¿es seguro usar sólo context.getContentResolver(), android.provider.Settings.Secure.ANDROID_ID ?

¿Por qué no obtienes la dirección MAC del dispositivo como lo hiciste en iOS? Esto también se puede realizar en dispositivos Android.

Voy a dar un fragmento de código que obtiene la dirección MAC del dispositivo ..

 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class HardwareUtil { public static String getMacAddress() { try{ Process process = Runtime.getRuntime().exec("cat /sys/class/net/eth0/address"); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); int read; char[] buffer = new char[4096]; StringBuffer output = new StringBuffer(); while ((read = reader.read(buffer)) > 0){ output.append(buffer, 0, read); } reader.close(); process.waitFor(); String hwaddr = output.toString(); return hwaddr; }catch (IOException e) { e.printstacktrace(); }catch (InterruptedException e){ e.printstacktrace(); } } } 

HardwareUtil.getMacAddress() devolverá la dirección MAC del dispositivo.

EDIT: Si la dirección MAC no es adecuada para su situación. A continuación puede ser útil!

 public static String getDeviceId(Context context) { final String deviceId = ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId(); if (deviceId != null) { return deviceId; } else { return android.os.Build.SERIAL; } } 

No olvide añadir el siguiente permiso a su archivo AndoridManifest.xml si utiliza el método getDeviceId .

 <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.