Necesito usar una identificación única para una aplicación de Android y pensé que el número de serie del dispositivo sería un buen candidato. ¿Cómo recupero el número de serie de un dispositivo Android en mi aplicación?
115
Necesito usar una identificación única para una aplicación de Android y pensé que el número de serie del dispositivo sería un buen candidato. ¿Cómo recupero el número de serie de un dispositivo Android en mi aplicación?
Respuestas:
getSystemService es un método de la clase Activity. getDeviceID () devolverá el MDN o MEID del dispositivo según la radio que utilice el teléfono (GSM o CDMA).
Cada dispositivo DEBE devolver un valor único aquí (suponiendo que sea un teléfono). Esto debería funcionar para cualquier dispositivo Android con una ranura SIM o radio CDMA. Estás solo con ese microondas con Android ;-)
fuente
Como menciona Dave Webb, el Blog para desarrolladores de Android tiene un artículo que cubre esto.
Hablé con alguien de Google para obtener aclaraciones adicionales sobre algunos elementos. Esto es lo que descubrí que NO se menciona en la publicación del blog antes mencionada:
De acuerdo con las recomendaciones de Google, implementé una clase que generará un UUID único para cada dispositivo, usando ANDROID_ID como semilla cuando corresponda, recurriendo a TelephonyManager.getDeviceId () según sea necesario, y si eso falla, recurriendo a un UUID único generado aleatoriamente que persiste en los reinicios de la aplicación (pero no en las reinstalaciones de la aplicación).
fuente
Este código devuelve el número de serie del dispositivo mediante una API de Android oculta.
fuente
Sin embargo, no se garantiza que la ID de Android sea un identificador único.
fuente
getContentResolver
está regresandonull
. Sin embargo, puede valer la pena abrir una pregunta y publicar su código.Hay una publicación excelente en el Blog de desarrolladores de Android que habla de esto .
Se recomienda no usarlo
TelephonyManager.getDeviceId()
ya que no funciona en dispositivos Android que no son teléfonos como tabletas, requiere elREAD_PHONE_STATE
permiso y no funciona de manera confiable en todos los teléfonos.En su lugar, puede utilizar uno de los siguientes:
La publicación analiza los pros y los contras de cada uno y vale la pena leerlo para que pueda determinar cuál sería el mejor para su uso.
fuente
Para obtener un número simple que sea exclusivo del dispositivo y constante durante toda su vida (salvo que se realice un restablecimiento de fábrica o piratería), use Settings.Secure.ANDROID_ID .
Para usar el número de serie del dispositivo (el que se muestra en "Configuración del sistema / Acerca de / Estado") si está disponible y recurrir al ID de Android:
fuente
El IMEI es bueno pero solo funciona en dispositivos Android con teléfono. También debe considerar la compatibilidad con tabletas u otros dispositivos Android que no tengan teléfono.
Tiene algunas alternativas como: miembros de la clase de compilación, BT MAC, WLAN MAC o incluso mejor, una combinación de todos estos.
He explicado estos detalles en un artículo de mi blog, consulte: http://www.pocketmagic.net/?p=1662
fuente
Dado que ninguna respuesta aquí menciona una identificación perfecta y a prueba de fallas que es PERSISTENTE a través de las actualizaciones del sistema y existe en TODOS los dispositivos (principalmente debido al hecho de que no hay una solución individual de Google), decidí publicar un método que es la siguiente mejor opción es combinar dos de los identificadores disponibles y una verificación para elegir entre ellos en tiempo de ejecución.
Antes del código, 3 hechos:
TelephonyManager.getDeviceId()
(akaIMEI) no funcionará bien o en absoluto para dispositivos que no sean GSM, 3G, LTE, etc., pero siempre devolverá una ID única cuando el hardware relacionado esté presente , incluso cuando no se inserte una SIM o incluso cuando no exista una ranura para SIM ( algunos OEM han hecho esto).Dado que Gingerbread (Android 2.3)
android.os.Build.SERIAL
debe existir en cualquier dispositivo que no proporcione IMEI , es decir, que no tenga presente el hardware mencionado anteriormente, según la política de Android.Debido al hecho (2.), al menos uno de estos dos identificadores únicos SIEMPRE estará presente , y SERIAL puede estar presente al mismo tiempo que el IMEI.
Nota: Los hechos (1.) y (2.) se basan en declaraciones de Google
SOLUCIÓN
Con los hechos anteriores, uno siempre puede tener un identificador único al verificar si hay hardware vinculado a IMEI, y recurrir a SERIAL cuando no lo es, ya que no se puede verificar si el SERIAL existente es válido. La siguiente clase estática presenta 2 métodos para verificar dicha presencia y usar IMEI o SERIAL:
Yo aconsejaría sobre el uso
getCleartextID_HARDCHECK
. Si el reflejo no se pega en su entorno, utilice elgetCleartextID_SIMCHECK
método en su lugar, pero tenga en cuenta que debe adaptarse a sus necesidades específicas de presencia de SIM.PD : tenga en cuenta que los OEM tienen logrado bloquear SERIAL contra la política de Google (varios dispositivos con la misma SERIAL), y Google, como se indicó, hay al menos un caso conocido en un gran OEM (no divulgado y no sé qué marca lo es, supongo que Samsung).
Descargo de responsabilidad : Esto responde a la pregunta original de obtener una ID de dispositivo única, pero el OP introdujo ambigüedad al afirmar que necesita una ID única para una APLICACIÓN. Incluso si para tales escenarios Android_ID sería mejor, NO FUNCIONARÁ después de, digamos, una copia de seguridad de titanio de una aplicación a través de 2 instalaciones de ROM diferentes (incluso puede ser la misma ROM). Mi solución mantiene una persistencia que es independiente de un flash o un restablecimiento de fábrica, y solo fallará cuando se produzca una manipulación de IMEI o SERIAL a través de hacks / modificaciones de hardware.
fuente
Hay problemas con todos los enfoques anteriores. En Google i / o, Reto Meier lanzó una respuesta sólida sobre cómo abordar esto, que debería satisfacer las necesidades de la mayoría de los desarrolladores de rastrear usuarios en todas las instalaciones.
Este enfoque le brindará una identificación de usuario segura y anónima que será persistente para el usuario en diferentes dispositivos (incluidas las tabletas, según la cuenta principal de Google) y en todas las instalaciones en el mismo dispositivo. El enfoque básico es generar una identificación de usuario aleatoria y almacenarla en las preferencias compartidas de las aplicaciones. Luego, usa el agente de respaldo de Google para almacenar las preferencias compartidas vinculadas a la cuenta de Google en la nube.
Repasemos el enfoque completo. Primero necesitamos crear una copia de seguridad para nuestras SharedPreferences usando el servicio de copia de seguridad de Android. Comience registrando su aplicación a través de este enlace: http://developer.android.com/google/backup/signup.html
Google le dará una clave de servicio de respaldo que debe agregar al manifiesto. También debe indicarle a la aplicación que use BackupAgent de la siguiente manera:
Luego, debe crear el agente de respaldo y decirle que use el agente auxiliar para las preferencias compartidas:
Para completar la copia de seguridad, debe crear una instancia de BackupManager en su actividad principal:
Finalmente, cree una ID de usuario, si aún no existe, y guárdela en SharedPreferences:
Este User_ID ahora será persistente en todas las instalaciones, incluso si el usuario cambia de dispositivo.
Para obtener más información sobre este enfoque, consulte la charla de Reto aquí. http://www.google.com/events/io/2011/sessions/android-protips-advanced-topics-for-expert-android-app-developers.html
Y para obtener detalles completos sobre cómo implementar el agente de respaldo, consulte el sitio para desarrolladores aquí: http://developer.android.com/guide/topics/data/backup.html Recomiendo particularmente la sección en la parte inferior sobre pruebas como lo hace el respaldo no suceda instantáneamente y, por lo tanto, para probar debe forzar la copia de seguridad.
fuente
Otra forma es usar / sys / class / android_usb / android0 / iSerial en una aplicación sin ningún permiso.
Para hacer esto en Java, uno solo usaría un FileInputStream para abrir el archivo iSerial y leer los caracteres. Solo asegúrese de envolverlo en un controlador de excepciones porque no todos los dispositivos tienen este archivo.
Se sabe que al menos los siguientes dispositivos tienen este archivo legible en todo el mundo:
También puede ver la publicación de mi blog aquí: http://insitusec.blogspot.com/2013/01/leaking-android-hardware-serial-number.html donde analizo qué otros archivos están disponibles para obtener información.
fuente
Como dice @haserman:
Pero es necesario incluir el permiso en el archivo de manifiesto:
fuente
ID de dispositivo único del dispositivo con sistema operativo Android como cadena.
pero recomiendo encarecidamente este método sugerido por Google:
Identificación de instalaciones de aplicaciones
fuente
Build.SERIAL
es la forma más sencilla de hacerlo, aunque no es del todo confiable, ya que puede estar vacío o, a veces, devolver un valor diferente ( prueba 1 , prueba 2 ) del que puede ver en la configuración de su dispositivo.Hay varias formas de obtener ese número según el fabricante del dispositivo y la versión de Android, así que decidí compilar todas las soluciones posibles que pude encontrar en una sola esencia . Aquí hay una versión simplificada:
fuente
Sé que esta pregunta es antigua, pero se puede hacer en una línea de código.
String deviceID = Build.SERIAL;
fuente
Encontré que la clase de ejemplo publicada por @emmby arriba es un excelente punto de partida. Pero tiene un par de defectos, como lo mencionan otros carteles. El principal es que persiste el UUID en un archivo XML innecesariamente y, a partir de entonces, siempre lo recupera de este archivo. Esto abre la clase a un truco fácil: cualquier persona con un teléfono rooteado puede editar el archivo XML para obtener un nuevo UUID.
Actualicé el código para que solo persista en XML si es absolutamente necesario (es decir, cuando se usa un UUID generado aleatoriamente) y modifiqué la lógica según la respuesta de @Brill Pappin:
fuente
Si. Es un número de serie de hardware del dispositivo y es único. Entonces, en el nivel de API 2.3 y superior, puede usar android.os.Build.ANDROID_ID para obtenerlo. Para niveles de API inferiores a 2.3, utilice TelephonyManager.getDeviceID () .
puede leer esto http://android-developers.blogspot.in/2011/03/identifying-app-installations.html
fuente