Files
FLP_2.0/Tracker.bas

212 lines
6.7 KiB
QBasic

B4A=true
Group=Default Group
ModulesStructureVersion=1
Type=Service
Version=10.5
@EndOfDesignText@
#Region Service Attributes
#StartAtBoot: True
#End Region
'******************************************************************************
'No olvidar agregar esta linea al editor de manifiesto:
' SetServiceAttribute(Tracker, android:foregroundServiceType, "location")
'
'En Starter agregar estas lineas en Process_Globals
' Public rp As RuntimePermissions
' Public FLP As FusedLocationProvider
' Private flpStarted As Boolean
'
'En Main agregar estas lineas a Activity_Resume
' Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_ACCESS_FINE_LOCATION)
' Wait For Activity_PermissionResult (Permission As String, Result As Boolean)
' If Result Then
' StartService(Tracker)
' Log("Start Tracker")
' Else
' ToastMessageShow("No permission", True)
' End If
'
'Se necesitan las librerias FusedLocationProvider, GPS, Phone y RunTimePermissions
'
'Y en Main agregar estas dos lineas:
'#AdditionalJar: com.android.support:support-v4
'#AdditionalJar: com.google.android.gms:play-services-location
Sub Process_Globals
Private nid As Int = 1
Private Tracking As Boolean
Private lock As PhoneWakeState
Public flp As FusedLocationProvider
Private flpStarted As Boolean
Dim minAccuracy As Int = 50
Dim killerCalled As Int = 0
Dim locReqSmall As LocationRequest
End Sub
Sub Service_Create
Service.AutomaticForegroundMode = Service.AUTOMATIC_FOREGROUND_NEVER 'we are handling it ourselves
Subs.revisaBD
flp.Initialize("flp")
flp.Connect
lock.PartialLock
StartFLP
If Starter.logger Then Log("FLP initialized")
Subs.bitacora($"Iniciamos Tracker"$)
End Sub
Sub Service_Start (StartingIntent As Intent)
locReqSmall = CreateLocationRequest2(1000, 0) 'ignore
Service.StopAutomaticForeground
Service.StartForeground(nid, Subs.CreateNotification("..."))
Track
StartServiceAt(Me, DateTime.Now + 60 * DateTime.TicksPerMinute, True)
Subs.bitacora($"Tracker - Service_Start"$)
End Sub
'Apagamos y prendemos sel servicio "Tracker" o reinicamos la aplicacion.
'killerCalled = 0 -> Apagamos y prendemos.
'killerCalled = 1 -> ExitApplication (se reinican todos los servicios).
Sub flpReConnect
Try
If killerCalled = 0 Then
killerCalled = 1
CallSubDelayed(Starter, "restartTracker")
Else
Subs.bitacora("Llamamos EXIT-APP")
ExitApplication
End If
Catch
Log("FLP-Tracker Error -> " & LastException)
End Try
End Sub
Sub flp_ConnectionSuccess
Log("FLP - Connected to location provider")
Subs.bitacora("FLP - Connection Success")
End Sub
Sub flp_ConnectionFailed(ConnectionResult1 As Int)
Log("Failed to connect to location provider")
Subs.bitacora("FLP - Connection Failed")
End Sub
Public Sub Track
If Starter.logger Then Log("Track")
If Tracking Then Return 'Si ya estamos "rastreando" no hacemos nada (return)
If Starter.rp.Check(Starter.rp.PERMISSION_ACCESS_FINE_LOCATION) = False Then
Log("No permission")
Return
End If
StartFLP 'Iniciamos FusedLocationProvider
Tracking = True
End Sub
Public Sub StartFLP
' Log("StartFLP - flpStarted="&flpStarted)
Private cont As Int = 0
Do While flp.IsConnected = False
Sleep(500)
Log($"FLP Sleeping - ${cont}"$)
Subs.bitacora($"Sleeping - ${cont}"$)
cont = cont + 1
If cont > 70 Then
cont = 0
LogColor("Reiniciamos FLP", Colors.red)
killerCalled = 1 : flpReConnect
End If
Loop
flp.RequestLocationUpdates(CreateLocationRequest) 'Buscamos ubicacion
flpStarted = True
' End If
End Sub
Sub CreateLocationRequest As LocationRequest
' Log("CreateLocationRequest")
Dim lr As LocationRequest
lr.Initialize
lr.SetInterval(30000) 'Intervalo deseado para actualizaciones de ubicacion en milisegundos
lr.SetFastestInterval(lr.GetInterval / 2) 'Intervalo minimo para actualizaciones de ubicacion
lr.SetSmallestDisplacement(30) 'Solo registra cambio de ubicacion si es mayor a XX mts
lr.SetPriority(lr.Priority.PRIORITY_HIGH_ACCURACY)
Return lr
End Sub
Sub CreateLocationRequest2(interval0 As Int, displacement0 As Int) As LocationRequest 'ignore
' Log("CreateLocationRequestSmall")
Dim lr As LocationRequest
lr.Initialize
lr.SetInterval(interval0) 'Intervalo deseado para actualizaciones de ubicacion en milisegundos
lr.SetFastestInterval(lr.GetInterval / 2) 'Intervalo minimo para actualizaciones de ubicacion
lr.SetSmallestDisplacement(displacement0) 'Solo registra cambio de ubicacion si es mayor a XX mts
lr.SetPriority(lr.Priority.PRIORITY_HIGH_ACCURACY)
Return lr
End Sub
Public Sub StopFLP
If Starter.logger Then Log("StopFLP")
If flpStarted Then
If flp.IsConnected Then flp.RemoveLocationUpdates 'Eliminamos todas las solicitudes de ubicacion
flpStarted = False
End If
End Sub
Sub flp_LocationChanged (Location1 As Location)
LogColor($"Location Changed - Acc: ${Location1.Accuracy}"$, Colors.blue)
Private minsTranscurridos As String = Subs.ticksAMins(DateTime.Now - Subs.traeUltimaUbicacionGuardada.Time) 'Minutos transcurridos desde la ultima ubicacion guardada.
LogColor(">>>>>>>>>>>>>>>>>>>>>>> " & minsTranscurridos, Colors.red)
If Not(IsPaused(Main)) Then
Main.laUbicacion = Location1
If Starter.logger Then Log("Main.laubicacion actializada")
End If
Dim el_texto As String = ""
Starter.UUC = Location1
If Starter.logger Then LogColor("FLP_LocationChanged", Colors.Red)
If Starter.logger Then Log(Location1.Accuracy&" - "&Location1.AccuracyValid)
If minsTranscurridos > 0 Then
flp.RequestLocationUpdates(CreateLocationRequest)
'Solo mandamos la ubicacion si la precision es dentro de XX mts
el_texto = $"LocChange - Coords NO enviadas (Acc:${Location1.Accuracy})."$
If Location1.Accuracy < minAccuracy Then
Subs.mandaLoc2(Location1, Starter.devModel)
el_texto = $"LocChange - Coords enviadas (Acc:${Location1.Accuracy})."$
End If
' If Starter.logger Then Log("Loc changed : "&Location1.Latitude&","&Location1.Longitude&"|"&Starter.devModel&"|")
Subs.bitacora($"${el_texto}"$)
' ToastMessageShow("LocChanged MORE than a min.", False)
Else
' ToastMessageShow("Locatin changed but less than a min!.", False)
End If
End Sub
Sub flp_ConnectionSuspended(SuspendedCause1 As Int)
Dim Cause As String
Log("ConnectionSuspended")
Subs.bitacora("ConnectionSuspended")
If(SuspendedCause1=flp.SuspendedCause.CAUSE_NETWORK_LOST) Then
Cause="Suspended by NetworkLost"
Else If(SuspendedCause1=flp.SuspendedCause.CAUSE_SERVICE_DISCONNECTED) Then
Cause="Suspended by Disconnected"
Else
Cause="Suspended: Unknow cause"
End If
Cause = Cause&": "& Subs.fechaNormal(DateTime.Now)
LogColor(Cause, Colors.magenta)
Subs.bitacora(Cause)
flp.Disconnect
Sleep(5000)
flp.Connect
End Sub
Sub Service_Destroy
If Tracking Then
Try
StopFLP
Catch
Log(LastException)
End Try
End If
Tracking = False
lock.ReleasePartialLock
Subs.bitacora($"Tracker - Service_Destroy"$)
End Sub