Spanish identificador unico de un dispositivo movil

Hola, necesito obtener un identificador unico de un dispositivo movil desde B4A, e visto un foro en el que se habla de esto y ponen la siguiente funcion:

B4X:
Sub LeerIdDispositivo As String

Dim p As Phone
Dim id As String
Dim r As Reflector
Dim Api As Int

Api = r.GetStaticField("android.os.Build$VERSION", "SDK_INT")

  If Api < 9Then
    'dispositivo antiguo
    id= p.GetSettings("android_id")
  Else
    'Nuevo dispositivo
    id= r.GetStaticField("android.os.Build", "SERIAL")
    If id.ToLowerCase = "unknown"Then id= p.GetSettings("android_id")
  EndIf

  Return id

End Sub

pero no me funciona, alguien podría poner un ejemplo completo que pueda descargar para poder probarlo en B4A.
GRACIAS.
 

cas6678

Active Member
Licensed User
Longtime User
Yo lo hago asi:
B4X:
Sub Globals
    Dim SerialId As String
    Dim Label1 As Label
End Sub

Sub Activity_Create(FirstTime As Boolean)
    Dim p As Phone
    SerialId=p.GetSettings("android_id")
    Label1.Initialize("Label1")
    Activity.AddView(Label1,10%x, 10%y, 50%x,10%y)
    Label1.Text=SerialId
End Sub
Necesitas la libreria phone.
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola

Ese código funciona, cambia esto:

B4X:
If id.ToLowerCase = "unknown"Then id= p.GetSettings("android_id")  ' quita esta linea

' Pon estas ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
id1 = id.ToLowerCase  ' acuerdate de declarar id1
If id1.Contains ("unknown") Then  id= p.GetSettings("android_id") 
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Saludos
 

cas6678

Active Member
Licensed User
Longtime User
Hola.

@bgsoft, me puedes decir que hace exactamente el codigo. No alcanzo a entender que hace extra a lo que yo he puesto y quizas me fuera util.

Gracias.
 

Gabino A. de la Gala

Active Member
Licensed User
Longtime User
Hola.

@bgsoft, me puedes decir que hace exactamente el codigo. No alcanzo a entender que hace extra a lo que yo he puesto y quizas me fuera util.

Gracias.

Por propia experiencia te puedo decir que las "comparaciones" con cadenas en B4X son un poco "especiales".

Si te parece, le pegas un vistazo a este hilo: https://www.b4x.com/android/forum/threads/solucionado-¿cómo-se-puede-comparar-el-contenido-de-dos-cadenas.71734/

Entiendo que @bgsoft utiliza el .contains para asegurar el que la comparación lo haga de la forma más "fiable".

Pero seguro que él nos lo aclarará más tarde.
 

cas6678

Active Member
Licensed User
Longtime User
No si mi pregunta no es por que cambia ToLowerCase por Contains, que si me lo quieren explicar bien :p. Mi pregunta es sobre que logra con el IF porque si lo que se quiere es identificar al dispositivo entiendo que con:
B4X:
SerialId=p.GetSettings("android_id")
...ya lo hago.

Me da la sensacion que hace algo mas y quisiera saber que y para que.
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola

Teneis razon los dos, aparte que con las prisas (tenia que marcharme a un sitio) se me olvidó una linea de código :rolleyes:

Quedaria asi:

B4X:
If id.ToLowerCase = "unknown"Then id= p.GetSettings("android_id")  ' quita esta linea
' Pon estas ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
id1= r.GetStaticField("android.os.Build", "SERIAL")
id1 = id.ToLowerCase  ' acuerdate de declarar id1
If id1.Contains ("unknown") Then  id= p.GetSettings("android_id")

Aclaremos algunas cosas:
1) Añado la variable id1 para hacerlo mas "entendible" , lo único que pretendo es coger los valores que me devuelve el r.GetStaticField y pasarlos a minuscula
2) Carlos, la diferencia con tu código son dos, que depende de la versión del sistema operativo que tenga el dispositvo, se ha de consultar una cosa u otra, de ahí a consultar el SDK, esto se podria obviar por que creo que quedan pocos ya con Android tan bajo, pero por unas lineas mas nos curamos en salud.
3) Y como bien dice Gabino, las comparaciones de cadenas en Android dejan mucho que desear, y como cuando haces la consulta dependerá del dispositivo que te va a devolver, pues lo hago con el Contains, me aseguro que si me devuelve además de "unknown" algun espacio o un CR o LF o los dos CRLF pueda saber que el dispositivo no lo ha reconocido. Seguro que si José traza le devuelve un unknown pero con algo mas y por eso no le funcionaba.

Bueno, como regalo a mis prisas :D, os paso y os comento una cosa que puede que ya sepais, pero para los que no lo sepan estará ahi.
No se si sabeis que algunas marcas de dispositivos chinos meten el mismo id a todos sus modelos, y esto depende de que quieras hacer con ese id es un gran problema, la mayoria mete este código "1234567890ABCDEF", pero otras del 1 al 9, asi que podeis añadir esto al código y así "lo cazais" en los dos casos ;)


B4X:
id1= r.GetStaticField("android.os.Build", "SERIAL")
id1 = id.ToLowerCase  ' acuerdate de declarar id1
If id.Contains ("unknown") Or id.Contains("123456789") Then id= p.GetSettings("android_id")

Saludos y perdonar el lapsus
 
Last edited:
Yo lo hago asi:
B4X:
Sub Globals
    Dim SerialId As String
    Dim Label1 As Label
End Sub

Sub Activity_Create(FirstTime As Boolean)
    Dim p As Phone
    SerialId=p.GetSettings("android_id")
    Label1.Initialize("Label1")
    Activity.AddView(Label1,10%x, 10%y, 50%x,10%y)
    Label1.Text=SerialId
End Sub
Necesitas la libreria phone.
 

bgsoft

Well-Known Member
Licensed User
Longtime User

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola cas6678, he probado tu codigo y funciona perfectamente.
muchas gracias
Hola José, como he comentado arriba, el código de Cas6678 funciona, pero yo añadiria lo último que te he puesto, primero por que aseguras la lectura si es un dispositivo con versión de SDK <9 (Android 2.2) que aunque no lo creas aun corren bastante (lo veo en las estadísticas de las aplicaciones que tengo subidas al Play Store), y lo de los dispositivos chinos es algo de ahora que me encuentro con mucha frecuencia, y si no lo tienes en cuenta, tendras un montón de id iguales.
Pero bueno, es solo un consejo de alquien que ha sufrido bastante hasta ver que el problema de muchos id de las navidades pasadas (por lo visto se regalaron muchos dispositivos chinos :D) era que su número de serie era el mismo, si por ejemplo quieres emplear el id para enviar mensajeria instantanea, te verás con ese problema.

Saludos
 

cas6678

Active Member
Licensed User
Longtime User
Yo uso la ID para validar la aplicacion, es decir otorgo a quien me lo pide una clave que depende de su ID, y por lo que dices si le doy la clave a uno de esos 1234567... se la estaria dando a muchos no? Bueno se soluciona no dando claves a esas ID.

Pero lo importante....entiendo que el tema esta es que por debajo de API 9 es un metodo y por arriba otro. Ok. Pero...


B4X:
  If Api < 9Then
    'dispositivo antiguo
    id= p.GetSettings("android_id")

Pero en este caso, copiado del inicio del post, esta usando el mismo metodo que uso yo (en mi caso siempre para API superiores), para API menores a 9.

Me estoy perdiendo algo?
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Carlos:

Bueno se soluciona no dando claves a esas ID.
No hace falta hacer eso, si tu con el código que he puesto detectas que es un movil chino, haces la otra consulta (la antigua que esa si te dará un valor diferente, y si quieres darle mas seguridad y ves que aun la antigua te da el mismo resultado (a mi en todos los que chequeé nunca lo hizo) pues puedes coger la dirección MAC, teóricamnete esa dirección es única, lo que pasa que con firmwares modificados la podrian cambiar, pero no es algo que suela suceder.
B4X:
If id.Contains ("unknown") Or id.Contains("123456789") Then id= p.GetSettings("android_id")

Me estoy perdiendo algo?
Bueno, si miras el código verás que si encuentra "unknown" o "123456789" hace una llamada al código antiguo (API<9)

Pero en este caso, copiado del inicio del post, esta usando el mismo metodo que uso yo (en mi caso siempre para API superiores), para API menores a 9
Si empleas ese método de APIS inferiores a 9 siempre, te vas a encontrar con algún dispositivo que no te devuelva nada, de ahí a mirar la API y consultar dependiendo de esta. No es algo que me haya inventado, en un post muy antiguo lo dice Erel

Saludos
 

cas6678

Active Member
Licensed User
Longtime User
Si empleas ese método de APIS inferiores a 9 siempre, te vas a encontrar con algún dispositivo que no te devuelva nada, de ahí a mirar la API y consultar dependiendo de esta. No es algo que me haya inventado, en un post muy antiguo lo dice Erel
Saludos

Entonces voy a tener que replantearmelo en mi app porque solo lo hacia con ese metodo. En todos los dispositivos me funcionaba. Voy a leer eso de Erel que comentas.

Muchas gracias.

PD: Estoy aprendiendo mucho pero tengo la sensacion que estoy llegando al limite del almacenamiento interno de mi cerebro...:p:p:p
 

Gabino A. de la Gala

Active Member
Licensed User
Longtime User
Entonces voy a tener que replantearmelo en mi app porque solo lo hacia con ese metodo. En todos los dispositivos me funcionaba. Voy a leer eso de Erel que comentas.

Muchas gracias.

PD: Estoy aprendiendo mucho pero tengo la sensacion que estoy llegando al limite del almacenamiento interno de mi cerebro...:p:p:p

Si pero ten cuidado de como haces el cambio. Porque si lo haces de "golpe". Todos los dispositivos posteriores al 9 te devolverán un valor diferente, por lo cual pueden dejar de funcionar o lo que "tengas" planificado para cuando la aplicación es utilizada por un nuevo dispositivo.
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Carlos:

Gabino tiene razón, no puedes hacer el cambio de golpe, por que perderas a los antiguos que se dieron de alta, yo tambien tuve ese problema, y es facil corregirlo, supongo que tu te guardas en archivo que ese dispositivo se dió de alta, crea un nuevo registro, que le puedes llamar LeidoDispositivoAnterior, modifica tu aplicación para que al arrancar verifique si le diste de alta, si no, emplea el nuevo sistema, de esa forma las nuevas altas empiezan bien.
Si por ejemplo ya está dado de alta, comprueba si es dispositivo chino, y si lo es anulas ese alta y creas una nueva con el nuevo sistema, asi evitas que un alta valga para muchos dispositivos.

Tambien puedes modificar la aplicación que te envie el id antiguo y el nuevo, si coincide no haces nada, si no coincide se lo cambias y ya luego haces la modificacion definitiva.

A ver, está claro que mejor que tu nadie sabe como funciona tu App, yo te he comentado de modo global como corregí yo tu mismo problema cuando me di cuenta que algunos dispositivos chinos tenian el mismo id.

Saludos
 

bgsoft

Well-Known Member
Licensed User
Longtime User
PD: Estoy aprendiendo mucho pero tengo la sensacion que estoy llegando al limite del almacenamiento interno de mi cerebro...:p:p:p

No te preocupes, no eres el unico :D, y el cerebro es listo, en vez de tener una pila FIFO ("Firts In, Firts Out") tiene una LIFO ("Last In, Firts Out" , asi que lo primero que aprendiste lo irás perdiendo :p:p:p

Saludos
 
Top