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 B4XPage_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 = 51042 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 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 ' Log("Connected to location provider") 'FLP.GetLastKnownLocation End Sub Sub flp_ConnectionFailed(ConnectionResult1 As Int) Log("Failed to connect to location provider") End Sub Sub Service_Start (StartingIntent As Intent) 'Para FusedLocationProvider (1 linea) Service.StopAutomaticForeground Service.StartForeground(nid, CreateNotification("...")) Track StartServiceAt(Me, DateTime.Now + 5 * DateTime.TicksPerMinute, True) FLP.GetLastKnownLocation.Initialize End Sub Public Sub Track ' Log("Inicia Track - Tracking : "&Tracking) If Not(FLP.IsInitialized) Then FLP.Initialize("flp") If Not(FLP.IsConnected) Then FLP.Connect If Tracking And actualLR.IsInitialized 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 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) ' Log("sleeping") Loop ' If flpStarted = False Then ' Log("RequestLocationUpdates") FLP.RequestLocationUpdates(CreateLocationRequest) 'Buscamos ubicacion ' Log("Buscamos ubicacion") ' Log(actualLR.GetSmallestDisplacement) flpStarted = True ' End If End Sub Public Sub StartFLPSmall ' Log("StartFLPSmall - flpStarted="&flpStarted) Do While FLP.IsConnected = False Sleep(500) Log("sleeping") Loop dameUltimaUbicacionConocida 'Regresamos ultima ubicacion conocida FLP.RequestLocationUpdates(CreateLocationRequestSmallD) 'Buscamos ubicacion 2 peticiones ' Log("Buscamos ubicacion Small displacement") ' Log("GPSSmallestDisplacement = " & actualLR.GetSmallestDisplacement) End Sub Private Sub CreateLocationRequest As LocationRequest ' 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(50) '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 CreateLocationRequestSmallD As LocationRequest ' Log("Iniciamos CreateLocationRequestSmallD") 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(1) '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 Starter.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) ' ToastMessageShow("Loc changed", False) ' Log($"Loc changed:${Location1.Longitude},${Location1.Latitude}"$) B4XPages.MainPage.lat_gps = Location1.Latitude B4XPages.MainPage.lon_gps = Location1.Longitude UUGCoords = Location1 ' Log("SmallestDisplacement="&actualLR.GetSmallestDisplacement) ' If DateTime.Now > LastUpdateTime + 10 * DateTime.TicksPerSecond Then ' Dim n As Notification = CreateNotification($"$2.5{Location1.Latitude} / $2.5{Location1.Longitude}"$) ' n.Notify(nid) ' LastUpdateTime = DateTime.Now ' End If '/////// para la ultima localización FL Dim sDate,sTime As String DateTime.DateFormat = "MM/dd/yyyy" sDate=DateTime.Date(DateTime.Now) sTime=DateTime.Time(DateTime.Now) If Not(B4XPages.MainPage.skmt.IsInitialized) Then B4XPages.MainPage.skmt.Initialize(Starter.ruta,"kmt.db", True) Try B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO HIST_GPS (HGDATE, HGLAT, HGLON) VALUES(?,?,?) ", Array As Object (sDate & sTime, B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps)) B4XPages.MainPage.skmt.ExecNonQuery("DELETE FROM HIST_GPS") Catch LogColor(LastException, Colors.Red) End Try '/////// Dim coords As String = Location1.Latitude&","&Location1.Longitude&","&formatoFecha(Location1.Time) ' Log("Loc changed : "&Location1.Latitude&","&Location1.Longitude&"|"&B4XPages.MainPage.usuario&"|") ' Log("Mandamos Ubicacion") ' Log(FirebaseMessaging.locRequest) ' Solo mandamos la ubicacion si la precision es menor a XX mts If Location1.Accuracy < 100 Then ' CallSubDelayed2(FirebaseMessaging,"mandamosLoc",coords) End If CallSub2(Starter, "GPS_LocationChanged", Location1) ' CallSub2(gestion, "GPS_LocationChanged", Location1) ' CallSub2(B4XPages.GetPage("Cliente"), "GPS_LocationChanged", Location1) ' CallSub2(nuevocliente, "GPS_LocationChanged", Location1) End Sub Sub CreateNotification (Body As String) As Notification 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 'Revisamos que el FLP (FusedLocationProvider) este inicializado y activo Sub revisaFLP 'ignore LogColor("**** **** Revisamos FLP **** ****", Colors.RGB(78,0,227)) Private todoBienFLP As Boolean = True Try If Not(FLP.IsInitialized) Then Subs.log2DB("revisaFLP: No esta inicializado ... 'Reinicializando FLP'") FLP.Initialize("flp") todoBienFLP = False End If Catch LogColor("If Not(Tracker.FLP.IsInitialized) --> "&LastException, Colors.Red) End Try Try If FLP.IsInitialized Then Try If Not(FLP.IsConnected) Then Subs.log2DB("revisaFLP: No esta conectado ... 'Reconectando FLP'") ' Tracker.FLP.Connect StartFLP todoBienFLP = False End If Catch LogColor("If Not(Tracker.FLP.IsConnected) --> "&LastException, Colors.Red) End Try Try If FLP.IsConnected And _ FLP.GetLastKnownLocation.IsInitialized And _ FLP.GetLastKnownLocation.DistanceTo(UUGCoords) > 500 Then Subs.log2DB("revisaFLP: 'No se esta actualizando, lo reiniciamos ...'") StartService(Me) todoBienFLP = False End If Catch LogColor("If FLP.IsConnectctd and FLP.getLKL.IsInitialized --> "&LastException, Colors.Red) End Try End If If todoBienFLP Then LogColor(" +++ +++ Sin errores en FLP", Colors.Green) Catch LogColor("If Tracker.FLP.IsInitialized --> "&LastException, Colors.Red) End Try ' revisar hora de lastKnownlocation y si es mayor de 10 minutos llamar StartFLP End Sub 'Compara la UUG (Ultima Ubicacion Guardada) con FLP.LastKnowLocation y si 'cumple con los requisitos de distancia y precision la guardamos en la BD. Sub revisaUUG 'ignore Try ' revisaFLP If FLP.IsInitialized And FLP.IsConnected Then Try If FLP.GetLastKnownLocation.IsInitialized Then ' Dim x As Location = FLP.GetLastKnownLocation Dim daa As Int = UUGCoords.DistanceTo(FLP.GetLastKnownLocation) 'Distancia de la UUG a la actual de Tracker.FLP.GetLastKnownLocation If Starter.Logger Then LogColor($"**** UUC "${Subs.fechaKMT(FLP.GetLastKnownLocation.Time)}|$0.2{FLP.GetLastKnownLocation.Accuracy}|$0.8{FLP.GetLastKnownLocation.Latitude}|$0.8{FLP.GetLastKnownLocation.Longitude}|$0.2{FLP.GetLastKnownLocation.Speed}|"$, Colors.RGB(255,112,35)) If daa > 40 And FLP.GetLastKnownLocation.Accuracy < 35 Then 'Si la distancia de la ubicacion anterior es mayor de XX y la precision es menor de XX, la guardamos ... B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO RUTA_GPS(fecha, lat, lon) VALUES (?,?,?)", Array As Object (Subs.fechaKMT(FLP.GetLastKnownLocation.Time),FLP.GetLastKnownLocation.Latitude,FLP.GetLastKnownLocation.Longitude)) If Starter.Logger Then Log("++++ Distancia a anterior="&daa&"|"&"Precision="&FLP.GetLastKnownLocation.Accuracy) End If UUGCoords = FLP.GetLastKnownLocation End If Catch LogColor("FLP.GetLastKnownLocation.IsInitialized --> "&LastException, Colors.Red) End Try Else Log("StartFLP") StartFLP End If Catch LogColor("If FLP.IsInitialized --> "&LastException, Colors.Red) End Try End Sub