programacion - Número de serie único de Android
manual de android en pdf (4)
Teniendo en cuenta que mi aplicación se dirige a Android 4.0 (API 14) y superior, ¿es el número android.os.Build.SERIAL de los dispositivos Android únicos para cada dispositivo?
De acuerdo con este útil article en el blog de Android Developers, android.os.Build.SERIAL
debe ser único si está disponible. Del artículo:
Los dispositivos sin telefonía deben informar una ID de dispositivo única aquí; algunos teléfonos también pueden hacerlo.
¿Esto significa que el número de serie podría no estar disponible?
Correcto, puede no estar disponible. Tenga en cuenta que dicen "Se requieren dispositivos sin telefonía ..." , por lo que solo los dispositivos sin "telefonía" (como wifi solo tabletas) deben proporcionar un número SERIAL
, aunque algunos teléfonos todavía funcionan (como el Nexus 4).
La documentación definitivamente carece de este tema, pero a partir de la redacción es posible que solo los "dispositivos sin telefonía" estén obligados a enviar una identificación única, mientras que los teléfonos que sí la envían 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 deviceId
es verificar primero un deviceId
(IMEI, o lo que no) y si deviceId
no existe, entonces puede recurrir a 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 debe usar el deviceId
. Necesita el permiso android.permission.READ_PHONE_STATE
.
Entonces, como el minSDK de tu aplicación es 14, puedes usar el campo android.os.Build.SERIAL
forma segura. 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 para obtener siempre una identificación de dispositivo única (excluya cualquier error, por supuesto).
Estoy desarrollando una aplicación de Android que apunta 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 restablecer la fábrica).
He encontrado muchos resultados en la web sobre identificadores únicos para dispositivos Android, pero muy poco sobre el número android.os.Build.SERIAL .
Hasta ahora, eliminé el uso de ANDROID_ID porque podría cambiar después de que se restablezca la fábrica. También eliminé el uso del IMEI porque el dispositivo Android podría no ser un teléfono. No puedo usar el wifi o bluetooth MAC ADDRESS 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.
Se puede acceder fácilmente usando android.os.Build.SERIAL (ya que se agrega en el nivel 9 de la API 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 número android.os.Build.SERIAL de los dispositivos Android únicos para cada dispositivo?
Actualmente, la documentación de android.os.Build.SERIAL indica: Un número de serie de hardware, si está disponible. Alfanumérico solamente, sin distinción de mayúsculas y minúsculas. ¿Esto significa 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?
Normalmente obtengo identificaciones únicas al hacer un hash SHA1 de una cadena única (nombre de la empresa por lo general) + imei (si no hay imei, dirección MAC [wifi, bluetooth, etc.]). Esto me da identificadores únicos que se ven iguales, tienden a ser únicos por dispositivo (no son perfectos si el MAC se cambia / falsifica).
Parece que resumiste la situación bastante bien.
El número de serie está destinado a ser único para cada dispositivo, pero (como es Android), por supuesto, hay errores que crean excepciones, por ejemplo, https://code.google.com/p/android/issues/detail?id=35193
Como usted señala, los documentos sugieren que se trata de un número de serie de hardware, pero la forma en que está redactado sugiere que no debe contar con eso. Y no lo confunda 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.
Lo he visto ampliamente informado de que el android_id se basa en el número de serie, pero creo que eso no es cierto. Hace poco observé que, en una tableta con la nueva capacidad multiusuario, cada cuenta de usuario tiene 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 buscas, a menos que estés preparado para depender de wifi o permisos bluetooth.
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
, es posible que no tengan un SERIAL
. Pero la probabilidad de ambos es baja.