¿Secure.ANDROID_ID es único para cada dispositivo?

81

Estoy usando esta llamada:

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

Para obtener un UID para el dispositivo. Sin embargo, creo que obtengo la misma ID de varios dispositivos. ¿Debería ser esto posible?

El ID en cuestión es: 9774d56d682e549c y aparentemente hay un problema con varios dispositivos que devuelven este ID http://code.google.com/p/android/issues/list?cursor=10603&updated=10603&ts=1295993403

FoamyGuy
fuente
Después de buscar la identificación en cuestión y ver un hilo al respecto, estoy seguro. Al principio pensé que era posible que el dispositivo estuviera devolviendo nulo y lo había puesto como predeterminado en alguna parte. Pero este no es el caso. Sé con certeza que obtengo el mismo valor en varios dispositivos.
FoamyGuy
1
Encontré perfecto: stackoverflow.com/a/16929647/1318946
Pratik Butani
Para los casos en los que no es único, use esta biblioteca que viene con Identity.getDeviceId (context) .
caw

Respuestas:

47

Mira esto hilo ,. Sin embargo, debe tener cuidado, ya que está documentado como "puede cambiar con el restablecimiento de fábrica". Úselo bajo su propio riesgo y se puede cambiar fácilmente en un teléfono rooteado. También parece que algunos fabricantes han tenido problemas con sus teléfonos con hilos de números duplicados . Dependiendo de lo que intente hacer, probablemente no usaría esto como UID.

ninjasense
fuente
19
Es una pena que la implementación de ANDROID_ID sea tan ... A juzgar por la documentación de Google, la intención era una identificación más duradera: A 64-bit number (as a hex string) that is randomly generated on the device's first boot and should remain constant for the lifetime of the device
Someone Somewhere
3
Según este enlace de hilo "Además, ha habido al menos un error ampliamente observado en un teléfono popular de un fabricante importante, donde cada instancia tiene el mismo ANDROID_ID". Mejor no usarlo
Muhammad Riyaz
2
Eso fue a partir de 2011 durante Froyo. Ahora es irrelevante.
Aubtin Samai
¿Qué pasa con la copia de seguridad / restauración de un dispositivo o la clonación de un dispositivo? ¿Alguna idea sobre la posibilidad de tener el mismo ANDROID_ID? asumiendo que el dispositivo no está rooteado, por supuesto.
FunkSoulBrother
39

Con Android O, el comportamiento de ANDROID_ID cambiará. El ANDROID_ID será diferente por aplicación por usuario en el teléfono.

Tomado de: https://android-developers.googleblog.com/2017/04/changes-to-device-identifiers-in.html

ID de Android

En O, la ID de Android (Settings.Secure.ANDROID_ID o SSAID) tiene un valor diferente para cada aplicación y cada usuario en el dispositivo. En su lugar, los desarrolladores que requieran un identificador de alcance de dispositivo deben usar un identificador que se pueda restablecer, como el ID de publicidad, lo que brinda a los usuarios más control. El ID de publicidad también proporciona una configuración de cara al usuario para limitar el seguimiento de anuncios.

Además en Android O:

  • El valor de ANDROID_ID no cambiará en la desinstalación / reinstalación del paquete, siempre que el nombre del paquete y la clave de firma sean los mismos. Las aplicaciones pueden confiar en este valor para mantener el estado en todas las reinstalaciones.
  • Si se instaló una aplicación en un dispositivo con una versión anterior de Android, el ID de Android sigue siendo el mismo cuando el dispositivo se actualiza a Android O, a menos que la aplicación se desinstale y vuelva a instalar.
  • El valor de ID de Android solo cambia si el dispositivo se restablece de fábrica o si la clave de firma rota entre los
    eventos de desinstalación y reinstalación.
  • Este cambio solo es necesario para los fabricantes de dispositivos que se envían con los servicios de Google Play y el ID de publicidad. Otros fabricantes de dispositivos pueden proporcionar una ID alternativa que se puede restablecer o continuar proporcionando una ID de ANDROID.
usuarioM1433372
fuente
Gracias. Me estaba poniendo los pelos de punta tratando de averiguar por qué no recibía anuncios de prueba en el teléfono de mi esposa usando la ID (md5'ed) reportada por Device ID y luego por qué esto no coincidía con el valor reportado a través del comando adb shell settings. .. Pensé que me estaba volviendo loco.
ECV
15

Entonces, si desea algo único para el dispositivo en sí, TM.getDeviceId() debería ser suficiente.

Aquí está el código que muestra cómo obtener la identificación del administrador de telefonía. La ID del dispositivo Android que está utilizando puede cambiar en la configuración de fábrica y también algunos fabricantes tienen problemas para dar una identificación única.

TelephonyManager tm = 
        (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
String androidId = Secure.getString(this.getContentResolver(), Secure.ANDROID_ID);
Log.d("ID", "Android ID: " + androidId);
Log.d("ID", "Device ID : " + tm.getDeviceId());

Asegúrese de obtener permisos para TelephonyManagerusar

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
Vincent Vettukal
fuente
3
Sí, usar getDeviceId () también funciona. Pero debe tener mucho cuidado, ya que puede devolver un valor nulo. (En dispositivos sin un módem 3g / phone) Una solución que uso es recurrir a la dirección mac de Wifi (que por supuesto también podría faltar, pero generalmente no en el mismo dispositivo)
vdstw
19
Requerir el READ_PHONE_STATEpermiso es terrible. Úselo en su ANDROID_IDlugar.
dolmen
sí, podría devolver un valor nulo en dispositivos sin 3g (muchos de ellos en el mercado), entonces debería usar WiFi; su guid también puede ser nulo hasta que lo encienda / apague al menos una vez después de reiniciar el dispositivo. Y si no hay wifi ... una verdadera pesadilla, en Windows CE había GUID para cada dispositivo y la vida era hermosa.
marcinj
Después de miles de solicitudes, resulta que la ID del dispositivo, que es el IMEI, se puede duplicar en dispositivos falsos, por lo que no es una solución completa. Estoy volviendo a usar getSimSerialNumber y ANDROID_ID como respaldo.
Ajibola
Android 10 (API nivel 29) agrega restricciones para identificadores que no se pueden restablecer, que incluyen tanto el IMEI como el número de serie. Antes de implementar el TM.getDeviceId()enfoque, primero eche un vistazo a los nuevos requisitos de permisos para identificadores de dispositivos en dispositivos Android> = 10.
Ezekiel Sebastine
6

He leído algunas cosas sobre esto y, desafortunadamente, no se debe confiar en ANDROID_ID para identificar un dispositivo individual de manera única.

No parece que se aplique en los requisitos de cumplimiento de Android, por lo que los fabricantes parecen implementarlo de la forma que eligen, incluidos algunos que lo usan más como una ID de 'modelo', etc.

Además, tenga en cuenta que incluso si un fabricante ha escrito un generador para convertirlo en un UUID (por ejemplo), no se garantiza que sobreviva a un restablecimiento de fábrica.

Squonk
fuente
6
Creo que está garantizado que NO sobrevivirá al restablecimiento de fábrica por diseño, se menciona en algún lugar de los documentos. Y esa es la forma correcta de implementarlo.
Jirafa violeta
Entonces, ¿cómo podemos generar un GUID?
IgorGanapolsky
6

Existen múltiples soluciones pero ninguna de ellas es perfecta. vayamos uno por uno.

1. Unique Telephony Number (IMEI, MEID, ESN, IMSI)

  • Esta solución necesita solicitar android.permission.READ_PHONE_STATE a su usuario, lo que puede ser difícil de justificar siguiendo el tipo de aplicación que ha realizado.

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

2. MAC Address

  • También puede intentar obtener una dirección MAC de un dispositivo que tenga 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 encendida para recuperar los datos. De lo contrario, la llamada no informa la dirección MAC.

3. Serial Number

  • Los dispositivos sin servicios de telefonía, como las tabletas, deben informar un ID de dispositivo único 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. Secure Android ID

  • En el primer arranque de un 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.

    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 es utilizar la clase UUID. La siguiente solución ha sido presentada por Reto Meier de Google en una presentación de Google I / O:

    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;
    }
    

Identificar un dispositivo en particular en Android no es tarea fácil. Hay muchas buenas razones para evitarlo. La mejor solución probablemente sea identificar una instalación en particular mediante el uso de la solución UUID. crédito: blog

Radhey
fuente
1

Simplemente enumere una solución alternativa aquí, el ID de publicidad:

https://support.google.com/googleplay/android-developer/answer/6048248?hl=en

Copiado del enlace de arriba:

El ID de publicidad es un ID de publicidad único que el usuario puede restablecer, proporcionado por los servicios de Google Play. Brinda a los usuarios mejores controles y brinda a los desarrolladores un sistema estándar simple para continuar monetizando sus aplicaciones. Permite a los usuarios restablecer su identificador u optar por no recibir anuncios personalizados (antes conocidos como anuncios basados ​​en intereses) dentro de las aplicaciones de Google Play.

Las limitaciones son:

  1. Solo dispositivos habilitados para Google Play.
  2. Política de privacidad: https://support.google.com/googleplay/android-developer/answer/113469?hl=en&rd=1#privacy
semicírculo21
fuente
¿Va a funcionar esto para teléfonos que no tienen Google Play (servicios)?
Max Waterman
Esto no es un GUID
IgorGanapolsky
0
//Fields
String myID;
int myversion = 0;


myversion = Integer.valueOf(android.os.Build.VERSION.SDK);
if (myversion < 23) {
        TelephonyManager mngr = (TelephonyManager) 
getSystemService(Context.TELEPHONY_SERVICE);
        myID= mngr.getDeviceId();
    }
    else
    {
        myID = 
Settings.Secure.getString(getApplicationContext().getContentResolver(), 
Settings.Secure.ANDROID_ID);
    }

Sí, Secure.ANDROID_ID es único para cada dispositivo.

Boraberka
fuente