Spanish Servicio GPS [SOLUCIONADO]

benji

Active Member
Licensed User
tengo un tema con un servicio GPS, este servicio se inicia con la aplicación, pero queda activo(se supone jaja) el tema es que una vez iniciada la aplicación, no siempre esta transmite su posición...
este es el código que uso...
el job que ocupo es el mismo que uso en otras aplicaciones para insertar los datos del GPS y funciona perfecto.


B4X:
Sub Process_Globals
    Dim GPS1 As GPS
   
    Dim Job1 As HttpJob
    Dim timer1 As Timer
    Dim SentenceUtils As String
       Dim AuxSentece As String

   
End Sub

Sub Service_Create
GPS1.Initialize("GPS")
If GPS1.GPSEnabled = False Then
        ToastMessageShow("Please enable the GPS device.", True)
        StartActivity(GPS1.LocationSettingsIntent) 'Will open the relevant settings screen.
End If
timer1.Initialize("Timer1",120000)
End Sub

Sub GPS_LocationChanged (Location1 As Location)

   
End Sub

Sub GPS_NMEA (TimeStamp As Long, Sentence As String)
   
       If Sentence.Contains("GPRMC") = True Then
           timer1.Enabled = True
        AuxSentece = Sentence
    End If
End Sub

Sub Service_Start (StartingIntent As Intent)

      StartServiceAt("", DateTime.Now + 120 * 1000,True)
    
      ToastMessageShow("Turning GPS ON", True)
   
     
      GPS1.Start(0,0) 

End Sub

Sub Timer1_Tick
    Dim su As StringUtils
   
   
    SentenceUtils = su.EncodeUrl(AuxSentece,"UTF8")
   

    Job1.Initialize("Job1",Me)
    Job1.Download("http://www.xxx.cl:8080/gprmc/Data?acct=estampa&dev=" & Main.PatenteGbl & "&gprmc=" & SentenceUtils)
    'End If
   
    
End Sub

Sub Service_Destroy

End Sub
   
Sub JobDone (Job As HttpJob)
   Log("JobName = " & Job.JobName & ", Success = " & Job.Success)
   If Job.Success = True Then
      Select Job.JobName
         Case "Job1", "Job2"
            'print the result to the logs
            Log(Job.GetString)
      End Select
   Else
      Log("Error: " & Job.ErrorMessage)
      ToastMessageShow("Error: " & Job.ErrorMessage, True)
   End If
   Job.Release
End Sub
 

bgsoft

Well-Known Member
Licensed User
Hola Benji:

Hay varias cosas, si haces un :

B4X:
  StartServiceAt("", DateTime.Now + 120 * 1000,True)
El timer sobra, ya que el servicio lo estas llamando cada 120 segundos igual que el timer.
Por otro lado si haces un
B4X:
 GPS1.Start(0,0)
Cada vez que entra el servicio, igual coincide con el timer y por eso no recibes. Yo lo pondria en el Create

Después hay una cosa, Android a veces mata los servicios si estan consumiendo mucho, o por que le falte memoria, y eso podria ser otra causa de que no recibas. Para evitar esto añade lo de abajo al servicio:

B4X:
#Region Service Attributes
#StartCommandReturnValue: android.app.Service.START_STICKY
Con esto si Android lo mata al cabo de algunos segundos lo pondrá en marcha

Si quieres que el servicio entre cuando reinicies el dispositivo movil :
B4X:
#Region Service Attributes#StartAtBoot: true

Pegale un vistazo a este tutorial:
https://www.b4x.com/android/forum/threads/b4a-tutorial-módulos-de-servicio.42689/



Saludos
 

benji

Active Member
Licensed User
gracias bgsoft,

estoy probando algunas cosas que mencionas...
con esto
B4X:
Sub GPS_NMEA (TimeStamp As Long, Sentence As String)
  
       If Sentence.Contains("GPRMC") = True Then
           timer1.Enabled = True
        AuxSentece = Sentence
    End If
End Sub

tenia la idea, una vez iniciado el servicio, cada 2 minutos enviara la información al servidor, si me dices que no use el timer, como controlo que se envié cada dos minutos la info?
 

benji

Active Member
Licensed User
gracias bgsoft,

estoy probando algunas cosas que mencionas...
con esto
B4X:
Sub GPS_NMEA (TimeStamp As Long, Sentence As String)
 
       If Sentence.Contains("GPRMC") = True Then
           timer1.Enabled = True
        AuxSentece = Sentence
    End If
End Sub

tenia la idea, una vez iniciado el servicio, cada 2 minutos enviara la información al servidor, si me dices que no use el timer, como controlo que se envié cada dos minutos la info?

ya, lo arregle(parece) insertando el job de envio de datos, en el Service_Start, que se ejecuta cada dos minutos... y esta llegando la info, cada dos minutos...
vamos a ver como anda y les cuento...

gracias bgsoft.
 

bgsoft

Well-Known Member
Licensed User
Hola Benji:

Con esto:
B4X:
  StartServiceAt("", DateTime.Now + 120 * 1000,True)

Haces que el tiempo que has puesto arriba (DateTime.Now + 120 * 1000) entre de nuevo en esto:
B4X:
Sub Service_Start (StartingIntent As Intent)

Creo que no te has leido el tutorial de módulos de servicios, alli lo pone :D

Saludos
 

bgsoft

Well-Known Member
Licensed User
Hola Benji

Te estaba escribiendo cuando tu lo hacias, veo que encontraste la solucion ;)

Saludos
 

bgsoft

Well-Known Member
Licensed User
Ponle el STICKY y así no te lo parará ;)

Y si ademas le añades a la cabecera [SOLUCIONADO] mejor para todos :D

Saludos
 

xavcor75

Member
Licensed User
Perdon si revivo el post pero queria preguntarte como te va con el tema del consumo de bateria. Yo hice un proceso similar al tuyo pero por los problemas de bateria cambie a un proceso con menor consumo usando los servicios de google...
 

bgsoft

Well-Known Member
Licensed User
Perdon si revivo el post pero queria preguntarte como te va con el tema del consumo de bateria. Yo hice un proceso similar al tuyo pero por los problemas de bateria cambie a un proceso con menor consumo usando los servicios de google...

Hola, mirate este post que se habla de varios métodos de leer la posición, igual te soluciona mejor el consumo de bateria que con la libreria GPS.
https://www.b4x.com/android/forum/t...sedlocationprovider-vs-locationmanager.80050/

Saludos
 
Top