B4A=true Group=Default Group ModulesStructureVersion=1 Type=Service Version=10.2 @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 'Para FusedLocationProvider (2 lineas) Public FLP As FusedLocationProvider Dim actualLR As LocationRequest Private flpStarted As Boolean Dim locRequest As String Dim UUGCoords As Location 'Ultima Ubicacion Guardada Dim trackerActividad, pushServiceActividad As String End Sub Sub Service_Create Service.AutomaticForegroundMode = Service.AUTOMATIC_FOREGROUND_NEVER 'we are handling it ourselves UUGCoords.Initialize 'Para FusedLocationProvider (2 lineas) FLP.Initialize("flp") FLP.Connect lock.PartialLock StartFLP End Sub Sub flp_ConnectionSuccess If Main.logger Then Log("Connected to location provider") 'FLP.GetLastKnownLocation End Sub Sub flp_ConnectionFailed(ConnectionResult1 As Int) If Main.logger Then Log("Failed to connect to location provider") End Sub Sub flp_ConnectionSuspended(ConnectionResult1 As Int) If Main.logger Then Log("FLP conection suspended") StartFLP End Sub Sub Service_Start (StartingIntent As Intent) LogColor("Iniciando Tracker ...", Colors.Green) Service.StopAutomaticForeground ' Service.StartForeground(51042, Subs.notiLowReturn("THIS (T)", PushService.wsStatus, 51042)) StartServiceAt(Me, DateTime.Now + 10 * DateTime.TicksPerMinute, True) Track Starter.trackerActividad = Subs.fechaKMT(DateTime.Now) ' Log("trackerActividad="&Starter.trackerActividad&"|"& Subs.fechaKMT(DateTime.Now)) End Sub Public Sub Track If Main.logger Then Log("Inicia Track - Tracking : "&Tracking) If Tracking Then ' Log(actualLR.GetSmallestDisplacement) Return 'Si ya estamos "rastreando" no hacemos nada (return) End If If Starter.rp.Check(Starter.rp.PERMISSION_ACCESS_FINE_LOCATION) = False Then If Main.logger Then Log("No permission") Return End If StartFLP 'Iniciamos FusedLocationProvider Tracking = True End Sub Public Sub StartFLP ' If Main.logger Then Log("StartFLP - flpStarted="&flpStarted) Do While FLP.IsConnected = False Sleep(500) ' If Main.logger Then Log("sleeping") Loop ' If flpStarted = False Then ' If Main.logger Then Log("RequestLocationUpdates") FLP.RequestLocationUpdates(CreateLocationRequest) 'Buscamos ubicacion ' If Main.logger Then Log("Buscamos ubicacion") ' If Main.logger Then Log(actualLR.GetSmallestDisplacement) flpStarted = True ' End If End Sub Public Sub StartFLP2Reqs If Main.logger Then Log("StartFLP - flpStarted="&flpStarted) Do While FLP.IsConnected = False Sleep(500) If Main.logger Then Log("sleeping") Loop dameUltimaUbicacionConocida 'Regresamos ultima ubicacion conocida FLP.RequestLocationUpdates(CreateLocationRequest2times) 'Buscamos ubicacion 2 peticiones If Main.logger Then Log("Buscamos ubicacion 2 peticiones") If Main.logger Then Log(actualLR.GetSmallestDisplacement) End Sub Private Sub CreateLocationRequest As LocationRequest If Main.logger Then Log("CreateLocationRequest") Dim lr As LocationRequest lr.Initialize lr.SetInterval(10000) 'Intervalo deseado para actualizaciones de ubicacion lr.SetFastestInterval(lr.GetInterval / 2) 'Intervalo minimo para actualizaciones de ubicacion lr.SetSmallestDisplacement(75) 'Solo registra cambio de ubicacion si es mayor a XX mts lr.SetPriority(lr.Priority.PRIORITY_HIGH_ACCURACY) actualLR=lr Return lr End Sub Private Sub CreateLocationRequest2times As LocationRequest If Main.logger Then Log("Iniciamos CreateLocationRequest2times") Dim lr As LocationRequest lr.Initialize lr.SetInterval(2000) 'Intervalo deseado para actualizaciones de ubicacion lr.SetFastestInterval(lr.GetInterval / 2) 'Intervalo minimo para actualizaciones de ubicacion lr.setNumUpdates(2) 'Solicitamos solo 2 actualizaciones con estos parametros lr.SetSmallestDisplacement(10) 'Solo registra cambio de ubicacion si es mayor a XX mts lr.SetPriority(lr.Priority.PRIORITY_HIGH_ACCURACY) actualLR=lr Return lr End Sub Sub dameUltimaUbicacionConocida If FLP.GetLastKnownLocation.IsInitialized Then 'Mandamos ultima ubicacion guardada ' If Main.logger Then Log("Mandamos UUC : "&formatoFecha(FLP.GetLastKnownLocation.Time)) If Main.Logger Then LogColor($"Mandamos UUC "${Subs.fechaKMT(FLP.GetLastKnownLocation.Time)}|Acc:$0.2{FLP.GetLastKnownLocation.Accuracy}|$0.8{FLP.GetLastKnownLocation.Latitude}|$0.8{FLP.GetLastKnownLocation.Longitude}|Spd:$0.2{FLP.GetLastKnownLocation.Speed}|"$, Colors.RGB(255,112,35)) Dim coords As String = FLP.GetLastKnownLocation.Latitude&","&FLP.GetLastKnownLocation.Longitude&","&formatoFecha(FLP.GetLastKnownLocation.Time) ' CallSubDelayed2(FirebaseMessaging,"mandamosLoc",coords) Subs.mandamosLoc(coords) End If End Sub Public Sub StopFLP 'Log("StopFLP") If flpStarted Then FLP.RemoveLocationUpdates 'Eliminamos todas las solicitudes de ubicacion flpStarted = False End If End Sub Sub flp_LocationChanged (Location1 As Location) Starter.trackerActividad = Subs.fechaKMT(DateTime.Now) UUGCoords = Location1 ' If Main.logger Then Log("SmallestDisplacement="&actualLR.GetSmallestDisplacement) CallSub2(Starter, "GPS_LocationChanged", Location1) ' CallSub2(gestion, "GPS_LocationChanged", Location1) ' CallSubDelayed2(gestion, "GPS_LocationChanged", Location1) Main.lat_gps = Location1.Latitude Main.lon_gps = Location1.Longitude '/////// para la ultima ubicacion FL Dim sDate,sTime As String DateTime.DateFormat = "MM/dd/yyyy" sDate=DateTime.Date(DateTime.Now) sTime=DateTime.Time(DateTime.Now) Try Starter.skmt.ExecNonQuery("DELETE FROM HIST_GPS") Starter.skmt.ExecNonQuery2("INSERT INTO HIST_GPS (HGDATE, HGLAT, HGLON) VALUES(?,?,?) ", Array As Object (sDate & sTime, Main.lat_gps, Main.lon_gps)) Catch If Main.logger Then Log("Error al borrar o insertar nuevas coordendas en HIST_GPS") End Try '/////// Dim coords As String = Location1.Latitude&","&Location1.Longitude&","&formatoFecha(Location1.Time) ' If Main.logger Then Log("Loc changed : "&Location1.Latitude&","&Location1.Longitude&"|"&Main.usuario&"|") If Main.logger Then Log("Mandamos Ubicacion") If Main.logger Then Log(locRequest) ' Solo mandamos la ubicacion si la precision es menor a XX mts If Location1.Accuracy < 100 Then Subs.guardaInfoEnBD(coords)'Escribimos coordenadas y fecha en BD ' CallSubDelayed2(FirebaseMessaging,"mandamosLoc",coords) Subs.mandamosLoc(coords) End If Dim origFormat As String = DateTime.TimeFormat 'Guardamos formato de fecha DateTime.TimeFormat = "HHmmss" ' Modificamos formato de fecha Dim minsDif As Int = DateTime.Time(DateTime.Now) - Main.ultimaActualizacionGPS ' If Main.logger Then Log("UltimaAct="&Main.ultimaActualizacionGPS&" MinsDif="&minsDif) If Location1.Accuracy < 100 And minsDif > 240 Then 'Si precision de 100 y 4 min transcurridos manda a web If Main.logger Then Log("actualizamos Ubicacion Web") CallSubDelayed(Starter, "ENVIA_ULTIMA_GPS") End If DateTime.TimeFormat = origFormat 'Regresamos formato de fecha original 'Revisamos servicios Subs.monitor End Sub Sub CreateNotification (Body As String) As Notification 'ignore Dim notification As Notification notification.Initialize2(notification.IMPORTANCE_LOW) notification.Icon = "icon" notification.SetInfo("INTMEX", Body, Main) Return notification End Sub Sub Service_Destroy If Tracking Then StopFLP End If Tracking = False lock.ReleasePartialLock End Sub Sub formatoFecha(fecha As String) As String 'Convierte una fecha al formato yyMMddHHmmss ' Log(fecha) Dim OrigFormat As String = DateTime.DateFormat 'save orig date format DateTime.DateFormat="yyMMddHHmmss" Dim lastUpdate As String=DateTime.Date(fecha) DateTime.DateFormat=OrigFormat 'return to orig date format ' Log(lastUpdate) Return lastUpdate End Sub