Spanish [B4A] [Tutorial] GPS

Glitchs

Member
Licensed User
Longtime User
Hola a todos.

Soy nuevo en B4A aunque tengo nociones básicas de VB. Estoy con la versión de pruebas intentando hacer un programa que me de la posición GPS cada cierto tiempo co un Timer o apretando un botón. El código aquí expuesto me funciona muy bien pero el evento se ejecuta cuando hay un cambio de coordenadas. Entonces se ejecuta la subrutina y del miembro Location1 se sacan todos los datos. El problema es que yo necesito saber el estado del GPS en cualquier momento y no solo cuando cambie la posición por tiempo o distancia. Por ejemplo apretando un botón que ejecute una rutina que de la posición y la calidad.
Os pongo mi código a ver que es lo que hay que cambiar porque no doy con ello.
B4X:
#Region Module Attributes
    #FullScreen: False
    #IncludeTitle: True
    #ApplicationLabel: GPS
    #VersionCode: 1
    #VersionName:
    #SupportedOrientations: unspecified
#End Region

Sub Process_Globals
    Public GPS1 As GPS
    Public locationw As Location
    End Sub
 
Sub Globals
    Dim lblLon As Label
    Dim lblLat As Label
    Dim lblSpeed As Label
    Dim lblSatellites As Label
    Dim precis,Vel,bearing,alt As Float
    Private lblprec As Label
    Private lblbearing As Label
    Private lblalt As Label
    Private lblaccval As Label
    Private lblspeedval As Label
    Dim a As Int
    Private btntest As Button
    Private Label1 As Label
End Sub

Sub Activity_Create(FirstTime As Boolean)
    If FirstTime Then
        GPS1.Initialize("GPS")
     End If
    Activity.LoadLayout("1")
   End Sub

Sub Activity_Resume
    If GPS1.GPSEnabled = False Then
        ToastMessageShow("Please enable the GPS device.", True)
        StartActivity(GPS1.LocationSettingsIntent) 'Will open the relevant settings screen.
    Else
        GPS1.Start(0,0) 'Listen to GPS with no filters.
    End If
  
End Sub

Sub Activity_Pause (UserClosed As Boolean)
    GPS1.Stop
End Sub




Sub GPS_LocationChanged (location1 As Location)
    lblLat.Text = "Lat = " & location1.ConvertToSeconds(location1.Latitude)
    lblLon.Text = "Lon = " & location1.ConvertToseconds(location1.Longitude)
    Vel=Round(location1.Speed*3600/1000)
    lblSpeed.Text = "Speed = " & Round2(Vel,1)
    precis=location1.accuracy
    lblprec.Text= "Prec = " & Round2(precis,1)
    bearing=location1.Bearing
    lblbearing.Text= "Bear = " & Round2(bearing,1)
    alt=location1.Altitude
    lblalt.Text= "Alt = " & Round2(alt,1)
    If location1.SpeedValid=True Then
     lblspeedval.text="SI"
    Else
    lblspeedval.text="NO"
    End If
    If location1.AccuracyValid=True Then
     lblaccval.text="SI"
    Else
    lblaccval.text="NO"
    End If
 
End Sub





Sub GPS_UserEnabled (Enabled As Boolean)
    ToastMessageShow("GPS device enabled = " & Enabled, True)
End Sub

Sub GPS_GpsStatus (Satellites As List)
    lblSatellites.Text = "Satellites:" & CRLF
    For i = 0 To Satellites.Size - 1
        Dim Satellite As GPSSatellite
        Satellite = Satellites.Get(i)
        If Satellite.UsedInFix=True Then
        a=a+1
        End If
    Next
    lblSatellites.Text = lblSatellites.Text & CRLF & a
    a=0
End Sub



Sub btntest_Click
locationw.Initialize
Label1.Text=locationw.Latitude
End Sub

Se que tiene que haber una forma sencilla de acceder a los datos GPS sin tener que esperar a que cambie la posición y pulsando un botón.

Muchas gracias de antemano.
Salu2
 
Last edited:
Saludos!!, precisamente ando trabajando con el mismo problema, y si que deberia de haber alguna solucion, quiero recuperar los datos GPS sin tener que cambiar de localizacion, es decir, sin tener que esperar a que el dispositivo se mueva para poder leer los datos.

Me baje un ejemplo de un programa que ademas de sacar la localizacion muestra las coordenadas en un mapa, estoy tratando de desarmarlo haber que se puede rescatar, sigo a la espera de encontrar algo que se pudiese hacer.

Besos!!
 

Glitchs

Member
Licensed User
Longtime User
Pues Suerte, porque he estado mirando por todo el foro y no he visto en ningún sitio como acceder fuera del evento location_change así que he adaptado todo el programa a esta carácterística. Como por ejemplo saber que no hay cobertura cuando pasa determinado tiempo sin coordenadas refrescadas.
Salu2
 

realsoft

New Member
Hola a todos, un amigo me recomendo cambiar de eclipse a B4A, el tiene licencia comprada y me dejo jugar un rato con el parra que me convenciera (estoy realizando un programa que utiliza GPS) y tengo una duda sobre el mismo ya que a la hora de probar un codigo simple sorpresa:

¿Porque devuelve las coordenadas como "Latitud 32:50.23337" y "Longitud 35:16.17923"?, si uno trata de abrir esas coordenadas en el maps es imposible leerlas, ¿hay algun modo de codificar correctamente esas coordenadas (que salgan por ejemplo como -92.23423 y 54.23423) para que puedan ser leidas desde un mapa?, he leido muy superficialmente sobre el Bearing, afecta en algo al programa?

Realmente tengo muchas ganas de comprar el B4A ya que vengo de Visual Basic, pero ya que mi trabajo generalmente tiene que ver con localizacion se me haria imposible mudarme si no pudiese leer los datos correctamente.

Saludos.
 

Gabriel Conti

Member
Licensed User
Longtime User
Hola realsoft.
Recuerdo que una vez me sucedió esto que comentas. Voy a buscar el código y te lo paso.
Pero en principio el problema no es tan grave. Solo hay que reemplazar los 2 puntos por un punto simple y lo que sigue a los : son minutos y sus decimales. Por lo tanto lo solo tenes que dividirlo por 60 y el resultado sumárselo a la parte entera (la que está antes de
En tu ejemplo
32:50.23337
50.23337/60=0.83722283333333333333333333333333
32+0.83722283333333333333333333333333
32.8372222833
Esa es la coordenada, obvio con el signo que corresponda
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola a tod@s

Hola a todos.
Soy nuevo en B4A aunque tengo nociones básicas de VB. Estoy con la versión de pruebas intentando hacer un programa que me de la posición GPS cada cierto tiempo co un Timer o apretando un botón.

Aunque un poco tarde, espero que os valga la respuesta.
Si poneis en marcha y luego de coger la ubicación en el evento parais, al siguiente marcha tendreis de nuevo el evento activado aunque no se haya movido la posición.


B4X:
Sub Globals
  Dim lm As LocationManager
' .............
' .............
' .............

Sub Activity_Create(FirstTime As Boolean)
  lm.Initialize("Localizacion")
' .............
' .............
' .............


Sub Activity_Pause (UserClosed As Boolean)
  If UserClosed  Then lm.stopMobileListening
' .............
' .............
' .............

' ------------------------------------------------------------------------------------------
' DONDE QUERAIS PONER EN MARCHA O PARAR (en el timer por ejemplo como decia Glitchs)
  lm.requestMobileLocation  ' pone en marcha localización
  lm.stopMobileListening  ' para localización
' ------------------------------------------------------------------------------------------


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) 
  ' cogemos los datos de longitud y latitud 
    
End Sub

Sub Localizacion_ProviderDisabled (Provider As String)

 Msgbox("Por favor, active la Ubicación", "Aviso GPS")
   
End Sub


Saludos
 

Carlos marin

Active Member
Licensed User
Longtime User
hola a todos, tengo una inquietud en cuanto al GPS, resulta lo siguiente:
el GPS me funciona de maravilla, el problema es cuando no conecta a ningún satélite entonces nunca manda coordenadas (también ejecute esta aplicación del GPS y no conecta a ningún satélite) me imagino que esto se debe al chip que tenga cada celular. pero lo curioso es que yo abro otras aplicaciones y estas me muestran digamos algo asi como una ubicación aproximada. ejemplos el waze, el maps, pokemon go, etc) como hacen estos programas para mostrar una ubicación si supuesta mente el GPS no me esta conectando???.. y si es posible poder adaptar este método a mi proyecto. bueno espero esto no solo me este pasando ami, muchas gracias
 
Cookies are required to use this site. You must accept them to continue using the site. Learn more…