Spanish [SOLUCIONADO] (B4A) Busco librería para calcular la ubicación geográfica

Seneca

Active Member
Licensed User
Hola.

En la App que estoy desarrollando he de mostrar al usuario la distania que le separa de varios destinos. Cómo calcular la distanca ya lo tengo visto. Lo que ahora me ocupa es detectar la posición actual del usuario, como paso previo al cáculo.

He visto que una posibilidad es usar GoogleMap.MyLocation y otra opción sería la librería FusedLocationProvider

Pretendo que la ubicación sea detectada incluso cuando no hay cobertura GPS.

Pido consejo sobre cuál de estas dos opciones, u otra distinta, es la más adecuada. Lo de GoogleMap.Mylocation lo he probado correctamente, pero la librería aún no he conseguido hacerla funcionar.

Saludos.
 

Descartex

Well-Known Member
Licensed User
Longtime User
Yo creo q GoogleMap.MyLocation es la opcion mas adecuada... además ya la has hecho funcionar.
Un saludo.
 

Seneca

Active Member
Licensed User
Gracias Descartex por tu opinión. Me decanto entonces por GoogleMap.

Lo de GoogleMap.Mylocation lo he probado correctamente, pero la librería aún no he conseguido hacerla funcionar.

Aunque creo que se ha entendido, matizo un poco lo anterior. En realidad tanto GoogleMap como FusedLocationProvider son librerías. Quería decir que esta última es la que aún no había conseguido hacer funcionar.

Saludos.
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Séneca:

Pretendo que la ubicación sea detectada incluso cuando no hay cobertura GPS.

Puedes hacerlo para que aunque no tengas GPS coja los datos por Wifi, gsm, etc :


B4X:
Sub Process_Globals
Dim GPS_Longitud=0 As Double
Dim GPS_Latitud=0 As Double
...

Sub Globals
Dim lm As LocationManager  ' Libreria LocationManager
....


lm.Initialize("Localizacion")

    ' marcha
    lm.requestGPSLocation  ' para GPS
    lm.requestMobileLocation ' Para mobil

  ' Parar
  lm.stopMobileListening
  lm.stopGPSListening

Sub Localizacion_LocationChanged (Longitude As Double, Latitude As Double, Altitude As Double, Accuracy As Float, Bearing As Float, Provider As String, Speed As Float, Time As Long)
  ' Entra cuando cambia de posición
' Log("Localizacion_LocationChanged (Longitude As Double, Latitude " & Longitude & "-" &Latitude )
  
   GPS_Latitud = Latitude
   GPS_Longitud = Longitude

  
End Sub




Sub Localizacion_ProviderDisabled (Provider As String)
  ' Entra cuando la ubicación está parada
  ' Puedes dar un mensaje de "Por favor, active la Ubicación"

  
End Sub

Saludos
 

Seneca

Active Member
Licensed User
Hola.

En algún hilo relativo a LocatioManager he leído que no debe ponerse en marcha la localización por GPS y por Móvil (lm.requestGPSLocation / lm.requestMobileLocation) de forma simultánea y por tanto hay que ver cuál es la opción más adecuada en cada caso. En ese sentido le encuentro una ventaja a la librería GoogleMaps en la que no hay que preocuparse de este aspecto, ya que Google se "busca la vida" para encontrar la ubicación independientemente de que haya de recurrir a GPS o cobertura móvil.

Saludos.
 

Seneca

Active Member
Licensed User
Hola de nuevo.

He querido tambien probar la librería FusedLocationProvider pero sigo sin hacer funcionar el ejemplo que el autor publica en el mensaje #2 de ese hilo.

En el mensaje #17 se indica:
You must run the Android SDK Manager and ensure that you have the latest version of Google Play Services installed, and you must also ensure that your copy of the Google Play Services library (google-play-services.jar) in your b4a additional libraries folder is a copy of the latest version.

Según parece, es necesario tener configurado el Google Play Services library y copiada la librería google-play-services.jar en la carpeta de librerías adicionales de B4A. El problema es que aunque en Android SDK Manager tengo instalado Google Play Services (rev.38) no consigo encontrar el archivo google-play-services.jar para llevármelo a B4A.

He repasado el hilo completo de FusedLocationProvider y algunos otros buscando una solución pero no he dado con ella. Si algún usuario experimentado quiere dedicar tiempo a probar el ejemplo de esa librería (mensaje #2) se lo agradecería enormemente.

(No he abierto un hilo nuevo para esta consulta porque entiendo que puede formar parte este mismo. Si consideran que deber ir en otro hilo, no tengo problema en cambiarlo)

Saludos.
 
Last edited:

Seneca

Active Member
Licensed User
De nuevo por aquí :D

He encontrado lo que me impedía ejecutar con éxito el ejemplo de la librería FusedLocationProvider. A partir de B4A v6 la manera de activar Google Play Service no es a través del archivo google-play-services.jar, el cual ya no es necesario.

En su lugar hay que añadir al Activity Main la línea:
B4X:
#AdditionalJar: com.google.android.gms:play-services-location
Y además en el código del ejemplo eliminar la línea:
B4X:
    #AdditionalRes: C:\Users\Martin\Programming\android-sdk_r24.0.2-windows\extras\google\google_play_services\libproject\google-play-services_lib\res, com.google.android.gms

Saludos.
 
Last edited:

Seneca

Active Member
Licensed User
Hola.

Tras probar las librerías GoogleMap, LocationManager, y FusedLocationProvider para calcular la ubicación geográfica del usuario, comento mis impresiones. Teniendo en cuenta que soy bastante neófito en B4A, estas no tienen por qué ser las más acertadas.

Para algo simple como determinar la ubicación de manera puntual, cualquiera de las dos primeras librerías es suficiente. Pero si se pretende algo más profundo, como ir obteniendo la ubicación durante todo el tiempo de ejecución de la App, o necesitar el que se pueda elegir la precisión de la ubicación (balanceado con el consumo de energía), la librería FusedLocationProvider es la ideal. Aunque su uso es bastante más complejo, también permite una serie de posibilidades que las otras librerías no aportan.

Por ejemplo, se puede seleccionar cada cuánto tiempo queremos que nos informe de una nueva ubicación, la distancia mínima recorrida necesaria para que informe de la misma, o su precisión. Además nos informa de si los ajustes del móvil relativos a ubicación (GPS: on/off) entran en conflicto con la precisión que hemos ajustado en la librería. Estas son solo algunas de sus posibilidades.

Otras ventajas: Puede usarse de manera combinada la localización por GPS y por cobertura móvil y el proceso puede implementarse, al contrario que GoogleMap, dentro de un servicio. En el mensaje #18 FusedLocationProvider se aporta un ejemplo de uso dentro de un servicio, que me ha resultado bastante práctico.

En el Blog www.sgoliver.net hay un hilo (Localización geográfica en Android (2)) que explica de manera sencilla algunas de las características de esta librería. Aunque el Blog, y por lo tanto el código que muestra, está dedicado a programación en lenguaje Android nativo, la teoría aportada en este hilo (entre otros) es igualmente válida para B4A.

Saludos.
 
Top