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 End Sub Sub Service_Create Service.AutomaticForegroundMode = Service.AUTOMATIC_FOREGROUND_NEVER 'we are handling it ourselves 'Para FusedLocationProvider (2 lineas) FLP.Initialize("flp") FLP.Connect lock.PartialLock StartFLP End Sub Sub flp_ConnectionSuccess If Starter.logger Then Log("Connected to location provider") 'FLP.GetLastKnownLocation End Sub Sub flp_ConnectionFailed(ConnectionResult1 As Int) If Starter.logger Then Log("Failed to connect to location provider") End Sub Sub flp_ConnectionSuspended(ConnectionResult1 As Int) If Starter.logger Then Log("FLP conection suspended") StartFLP End Sub Sub Service_Start (StartingIntent As Intent) If Starter.logger Then Log("Tracker Service Started") 'Para FusedLocationProvider (1 linea) Service.StopAutomaticForeground Service.StartForeground(nid, CreateNotification("...")) Track StartServiceAt(Me, DateTime.Now + 5 * DateTime.TicksPerMinute, True) End Sub Public Sub Track If Starter.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 Starter.logger Then Log("No permission") Return End If StartFLP 'Iniciamos FusedLocationProvider Tracking = True End Sub Public Sub StartFLP Log("StartFLP - flpStarted="&flpStarted) Do While FLP.IsConnected = False Sleep(500) If Starter.logger Then Log("dk - sleeping") Loop ' If flpStarted = False Then If Starter.logger Then Log("RequestLocationUpdates") FLP.RequestLocationUpdates(CreateLocationRequest) 'Buscamos ubicacion If Starter.logger Then Log("Buscamos ubicacion") If Starter.logger Then Log(actualLR.GetSmallestDisplacement) flpStarted = True ' End If End Sub Public Sub StartFLP2Reqs If Starter.logger Then Log("StartFLP - flpStarted="&flpStarted) Do While FLP.IsConnected = False Sleep(500) If Starter.logger Then Log("dk - sleeping") Loop dameUltimaUbicacionConocida 'Regresamos ultima ubicacion conocida FLP.RequestLocationUpdates(CreateLocationRequest2times) 'Buscamos ubicacion 2 peticiones If Starter.logger Then Log("Buscamos ubicacion 2 peticiones") If Starter.logger Then Log(actualLR.GetSmallestDisplacement) End Sub Private Sub CreateLocationRequest As LocationRequest If Starter.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 Starter.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 Starter.logger Then Log("Mandamos GetLastKnownLocation : "&formatoFecha(FLP.GetLastKnownLocation.Time)) Dim coords As String = FLP.GetLastKnownLocation.Latitude&","&FLP.GetLastKnownLocation.Longitude&","&formatoFecha(FLP.GetLastKnownLocation.Time) CallSubDelayed2(FirebaseMessaging,"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) If Starter.logger Then Log("SmallestDisplacement="&actualLR.GetSmallestDisplacement) ' CallSub2(Starter, "GPS_LocationChanged", Location1) ' CallSub2(gestion, "GPS_LocationChanged", Location1) ' CallSub2(MAPA_RUTAS, "GPS_LocationChanged", Location1) ' CallSub2(fila, "GPS_LocationChanged", Location1) Starter.lat_gps = Location1.Latitude Starter.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, Starter.lat_gps, Starter.lon_gps)) Catch If Starter.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 Starter.logger Then Log("Loc changed : "&Location1.Latitude&","&Location1.Longitude&"|"&Starter.usuario&"|") If Starter.logger Then Log("Mandamos Ubicacion") If Starter.logger Then Log(FirebaseMessaging.locRequest) ' Solo mandamos la ubicacion si la precision es dentro de XX mts If Location1.Accuracy < 300 Then CallSubDelayed2(FirebaseMessaging,"mandamosLoc",coords) 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) - Starter.ultimaActualizacionGPS ' If Starter.logger Then Log("UltimaAct="&Starter.ultimaActualizacionGPS&" MinsDif="&minsDif) If Location1.Accuracy < 100 And minsDif > 240 Then 'Si precision de 100 y 4 min transcurridos manda a web If Starter.logger Then Log("actualizamos Ubicacion") CallSubDelayed(Starter, "ENVIA_ULTIMA_GPS") End If DateTime.TimeFormat = origFormat 'Regresamos formato de fecha original ' CallSubDelayed2(FirebaseMessaging,"mandamosLoc",coords) End Sub Sub CreateNotification (Body As String) As Notification Dim notification As Notification notification.Initialize2(notification.IMPORTANCE_LOW) notification.Icon = "icon" notification.SetInfo("Durakelo", Body, Main) If Starter.logger Then Log("Creamos notificacion") 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