Número de Serie Único de Android


Estoy desarrollando una aplicación para Android que se dirige a Android 4.0 (API 14) y superior.

Estoy buscando un número de serie que sea único por dispositivo y que persista para siempre (muere con el dispositivo, no cambia después de los reinicios de fábrica).

He encontrado muchos resultados en la web sobre identificadores únicos para dispositivos android, pero muy pocos en el android.operativo.Construir.SERIAL number.

Hasta ahora, eliminé el uso del ANDROID_ID porque podría cambiar después de los reinicios de fábrica. También eliminé el uso del IMEI porque el dispositivo Android podría no ser un teléfono. No puedo usar la DIRECCIÓN MAC DE wifi o bluetooth porque el dispositivo podría no tener dicho hardware y/o dichas direcciones mac podrían no ser legibles si el hardware no está habilitado (según lo que encontré en la web).

Creo que podría ir por el número de serie del dispositivo Android.

Es fácilmente accesible usando android.operativo.Construir.SERIAL (ya que se agrega en el nivel de API 9 y no necesita ningún permiso adicional).

Mis preguntas son :

  • Teniendo en cuenta que mi aplicación se dirige a Android 4.0 (API 14) y superior, es el android.operativo.Construir.SERIAL número para los dispositivos android único para cada dispositivo ?

  • Actualmente, la documentación de android.operativo.Construir.SERIAL indica : Un número de serie de hardware, si está disponible. Solo alfanumérico, insensible a mayúsculas y minúsculas. ¿Significa esto que el número de serie podría no estar disponible ?

  • ¿Cuál podría ser otra alternativa que cumpla con las condiciones mencionadas anteriormente ?

Author: Leeeeeeelo, 2013-04-18

4 answers

Teniendo en cuenta que mi aplicación se dirige a Android 4.0 (API 14) y superior, es el android.operativo.Construir.Número de serie para los dispositivos Android único para cada dispositivo ?

De acuerdo con este útil artículo en el blog de Desarrolladores de Android, android.os.Build.SERIAL debe ser único si está disponible. Del artículo:

Los dispositivos sin telefonía deben reportar un ID de dispositivo único aquí; algunos teléfonos pueden hacerlo también.

¿Significa esto que el número de serie podría no estar disponible ?

Correcto, puede que no esté disponible. Observe que dicen "Se requieren dispositivos sin telefonía...", por lo que solo los dispositivos sin "telefonía" (como solo las tabletas wifi) deben proporcionar un número SERIAL, aunque algunos teléfonos todavía lo hacen (como el Nexus 4).

Definitivamente falta documentación sobre este tema, pero de la redacción es posible que solo se requiere que los" dispositivos sin telefonía " envíen un ID único, mientras que los teléfonos que envían uno pueden no ser únicos.

¿Cuál podría ser otra alternativa que cumpla con las condiciones mencionadas anteriormente ?

Para su situación creo que su mejor apuesta es comprobar primero para un deviceId (IMEI, o lo que no) y si deviceId no existe, entonces usted recurre a usar android.os.Build.SERIAL (ya que esto es probablemente una tableta) así:

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

Tenga en cuenta que para usar deviceId necesita el permiso android.permission.READ_PHONE_STATE.

Así que dado que el minSdk de tu app es 14, puedes usar de forma segura el campo android.os.Build.SERIAL. Y si asumimos que los dispositivos sin telefonía realmente siempre proporcionan ID únicos en SERIAL, entonces creo que esta sería una apuesta segura en obtener siempre un id de dispositivo único (salvo cualquier error, por supuesto).

 49
Author: Tony Chan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-08 22:32:05

Yo personalmente uso Secure.ANDROID_ID & Build.SERIAL para identificar un teléfono:

androidId = Settings.Secure.getString(this.getContentResolver(), 
                Settings.Secure.ANDROID_ID) + Build.SERIAL;

Pueden tener el mismo ANDROID_ID, pueden no tener un SERIAL. Pero la posibilidad de ambos es baja.

 9
Author: Kai Wang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-07 21:54:22

Parece haber resumido la situación bastante bien.

El número de serie está destinado a ser único para cada dispositivo, pero (siendo este Android) hay, por supuesto, errores que crean excepciones, e. g. https://code.google.com/p/android/issues/detail?id=35193

Como usted señala, los documentos sugieren que esto está destinado a ser un número de serie de hardware, pero la forma en que está redactado sugiere que no debe contar con eso. Y no confunda eso con el dispositivo real número de serie, es decir, el número de serie impreso en el reverso o en la caja. Además, creo que es mucho menos utilizado que android_id, por lo que bien podría haber problemas que no se informan.

He visto ampliamente reportado que el android_id se basa en el número de serie, pero creo que no es cierto - Recientemente observé que, en una tableta con la nueva capacidad multiusuario, cada cuenta de usuario obtiene su propio android_id pero el número de serie es el mismo para ambos.

AFAIK 'otra alternativa' no existe: su lista está completa. El número de serie es lo más cercano a lo que está buscando a menos que esté preparado para depender de los permisos de wifi o Bluetooth.

 3
Author: Tom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-07 00:19:40

Generalmente obtengo id únicos haciendo un hash SHA1 de alguna cadena única (nombre de la compañía generalmente) + imei (si no hay imei, dirección mac [wifi, bluetooth, etc]). Esto me da ID únicos que se ven iguales, tienden a ser únicos por dispositivo (aunque no es perfecto si la MAC se cambia/falsifica).

 0
Author: Ryan Schultz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-07 00:26:10