Número de serie único de Android

Estoy desarrollando una aplicación Android que tiene como objetivo Android 4.0 (API 14) y superior.

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

He encontrado muchos resultados en la web con respecto a identificadores únicos para dispositivos Android, pero muy poco en el número android.os.Build.SERIAL .

Hasta ahora, he eliminado el uso de ANDROID_ID porque podría cambiar después de restablecer la fábrica. También eliminé el uso del IMEI porque el dispositivo de android podría ser no-teléfono. No puedo usar la dirección wifi o bluetooth MAC porque el dispositivo puede no tener dicho hardware y / o tales direcciones MAC pueden no ser legibles si el hardware no está habilitado (basado en lo que encontré en la web).

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

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

Mis preguntas son:

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

  • Actualmente, la documentación de android.os.Build.SERIAL indica: Un número de serie del hardware, si está disponible. Sólo alfanumérico, sin distinción entre mayúsculas y minúsculas. ¿Significa esto que el número de serie puede no estar disponible?

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

Teniendo en cuenta que mi aplicación se orienta a Android 4.0 (API 14) y superior, es el número android.os.Build.SERIAL para los dispositivos android únicos para cada dispositivo?

De acuerdo con este artículo útil 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 están obligados a informar aquí un ID de dispositivo único; Algunos teléfonos pueden hacerlo también.

¿Significa esto que el número de serie puede no estar disponible?

Correcto, puede no estar disponible. Tenga en cuenta que dicen "dispositivos sin telefonía son necesarios …" , por lo que sólo los dispositivos sin "telefonía" (como wifi sólo comprimidos) son necesarios para proporcionar un número de serie, aunque algunos teléfonos todavía lo hacen (como el Nexus 4).

La documentación es definitivamente falta en este tema, pero de la redacción es posible que sólo los "dispositivos sin telefonía" son necesarios para presentar una identificación única, mientras que los teléfonos que envían uno puede no ser único.

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

Para su situación, creo que su mejor deviceId es comprobar primero un deviceId (IMEI, o qué no) y si deviceId no existe, entonces vuelve a usar android.os.Build.SERIAL (ya que esta es probablemente una tableta), como asi que:

 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 aplicación es 14, puedes usar el campo android.os.Build.SERIAL sin peligro. Y si asumimos que los dispositivos sin telefonía realmente siempre proporcionan identificadores únicos en SERIAL entonces creo que esto sería una apuesta segura siempre obteniendo un ID de dispositivo único (bar cualquier error, por supuesto).

Personalmente, utilizo AndroidID y Build.SERIAL para identificar un teléfono.

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

Es posible que tengan el mismo AndroidID, que podrían no tener serie. Pero la oportunidad de tenerlos a ambos, es baja.

Usted parece haber resumido la situación bastante bien.

El número de serie está destinado a ser único para cada dispositivo, pero (esto es Android), por supuesto, los errores que crean excepciones, por ejemplo, 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 usted no debe contar con eso. Y no confunda eso con el número de serie real del dispositivo, es decir, el número de serie impreso en la parte posterior o en la caja. Además, creo que es mucho menos utilizado que android_id, por lo que podría haber problemas que no se informan.

He visto ampliamente que el android_id se basa en el número de serie, pero creo que no es cierto – Recientemente he observado que, en una tableta con la nueva capacidad multiusuario, cada cuenta de usuario obtiene su propio android_id pero el 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 parecido a lo que está buscando a menos que esté preparado para depender de los permisos de wifi o bluetooth.

Normalmente obtengo id único haciendo un SHA1 hash de alguna cadena única (nombre de la empresa por lo general) + imei (si no imei, dirección MAC [wifi, bluetooth, etc]). Esto me da id único que se ven iguales, tienden a ser único por dispositivo (no es perfecto si el MAC es cambiado / fingido).

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.