Delphi xe10 gps del servicio del androide

Estoy usando Emabarcadero Delphi XE 10 Seattle Actualización 1 para crear un servicio de Android, he encontrado este enlace tutorial y creado una aplicación de servicio, lo que quiero hacer es conseguir la ubicación actual en cada 5 segundos con el sensor de ubicación y guardar en la base de datos . Estoy haciendo eso en mi mainform pero cuando cierro el programa se detiene, así que no pude encontrar ningún artículo sobre cómo puedo sincronizar mi aplicación y servicio. He intentado agregar temporizador y LocateSensor a la forma de servicio, pero Delphi no me permite añadir a la forma de servicio de cualquier objeto, creo que tengo que enviar un comando al servicio o de alguna manera necesito conectar el servicio y el programa, he encontrado una muestra Que muestra cómo descargar imágenes con el servicio, pero es demasiado experto para un novato como yo 🙂

Mira este artículo. Daniele Spinetti resuelve el problema usando LocationSensor en servicio.

Ponga System.Sensors y System.Android.Sensors unidades a su proyecto y hacer cambios (Delphi 10 Seattle).

System.Sensors.pas

 // about line 748 implementation uses System.Variants, System.Math, System.Character, {$IFDEF ANDROID} // -- patch // include the modified System.Android.Sensors System.Android.Sensors; {$ENDIF ANDROID} 

System.Android.Sensors.pas

 //about line 12 uses // -- patch // use the modified System.Sensors System.Sensors; ... // about line 70 class constructor TPermission.Create; var PackageInfo: JPackageInfo; PackageManager: JPackageManager; Activity: JActivity; LContext: JContext; begin // -- patch // Activity := TJNativeActivity.Wrap // (PANativeActivity(System.DelphiActivity)^.clazz) LContext := TJContextWrapper.Wrap(System.JavaContext); PackageManager := LContext.getPackageManager(); PackageInfo := PackageManager.getPackageInfo (LContext.getApplicationContext.getPackageName, TJPackageManager.JavaClass.GET_PERMISSIONS); FPermissions := PackageInfo.requestedPermissions; end; ... // about line 100 type TAndroidGeocoder = class(TGeocoder) private type TGeocoderRunnable = class(TJavaLocal, JRunnable) private FCoord: TLocationCoord2D; FLGeocoder: JGeocoder; public constructor Create(ACoord: TLocationCoord2D; AGeocoder: JGeocoder); procedure run; cdecl; end; private class var FGeocoder: JGeocoder; // FActivity: JActivity; // -- patch FActivity: JContextWrapper; // -- patch ... // about line 130 TUIAndroidLocationSensor = class(TCustomLocationSensor) private FPermitted: Boolean; // FActivity: JNativeActivity; // -- patch FActivity: JContext; // -- patch FLastValue: JLocation; FLocationManager: JLocationManager; FAccuracy: TLocationAccuracy; ... // about line 1500 constructor TUIAndroidLocationSensor.Create(AManager: TSensorManager); var LocationService: JObject; begin inherited; // FActivity := TJNativeActivity.Wrap // (PANativeActivity(System.DelphiActivity)^.clazz); // -- patch FActivity := TJContext.Wrap(System.JavaContext); // -- patch LocationService := FActivity.getSystemService (TJContext.JavaClass.LOCATION_SERVICE); if Assigned(LocationService) then FLocationManager := TJLocationManager.Wrap((LocationService as ILocalObject) .GetObjectID); end; ... // about line 1530 function RunIfPossible(var ARunnable: TLocationRunnable; var AListener: TLocationListener; AProviderName: JString): Boolean; var Provider: JLocationProvider; LHandler: JHandler; begin Result := False; if FLocationManager.isProviderEnabled(AProviderName) then begin if AListener = nil then AListener := TLocationListener.Create(Self); Provider := FLocationManager.getProvider(AProviderName); if Provider <> nil then begin ARunnable := TLocationRunnable.Create(FLocationManager, AListener, AProviderName); // FActivity.runOnUiThread(ARunnable); // --patch // -- patch // You can use post method of Handler instead runOnUiThread in this case. // more info here: http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html LHandler := TJHandler.JavaClass.init; LHandler.post(ARunnable); Result := True; end; end; end; ... // about line 1730 class constructor TAndroidGeocoder.Create; begin // -- patch // FActivity := TJNativeActivity.Wrap // (PANativeActivity(System.DelphiActivity)^.clazz); FActivity := TJContextWrapper.Wrap(System.JavaContext); FGeocoder := TJGeocoder.JavaClass.init(FActivity); end; 

A continuación, puede utilizar LocationSensor como este:

 uses System.Sensors, System.Android.Sensors; ... var FSensors: TSensorArray; Sensor: TCustomSensor; begin TSensorManager.Current.Active := true; FSensors := TSensorManager.Current.GetSensorsByCategory(TSensorCategory.Location); FSensor := nil; for Sensor in FSensors do begin if TCustomLocationSensor(Sensor).SensorType = TLocationSensorType.GPS then begin FSensor := TCustomLocationSensor(Sensor); Break; end; end; if not Assigned(FSensor) then Exit; { no location sensor is available } { start the sensor if it is not started } if not FSensor.Started then FSensor.Start; 

Si TTimer no está funcionando como esperabas intentar hacer todas tus cosas en el hilo anónimo y usar TThread.CurrentThread.Sleep en el hilo principal

  Función TServiceModule.AndroidServiceStartCommand (const Remitente: TObject;
   Const Intención: JIntent;  Flags, StartId: Integer): Entero;
 empezar
   Resultado: = TJService.JavaClass.START_STICKY;

   TThread.CreateAnonymousThread (procedimiento
     empezar
       repetir
         TThread.Current.Sleep (MSecsPerSec);
         TThread.CreateAnonymousThread (procedimiento
           Hacer cosas();
         End) .Start;
         TThread.Current.Sleep (MSecsPerSec);
       Hasta (TThread.Current.CheckTerminated);
     End) .Start;
 fin;
  • Mejores prácticas para pubnub en android
  • ¿Qué significa la pérdida de una conexión de servicio?
  • Llamar el método de clase de actividad de la clase de servicio
  • Thread, Asynctask o intentService para mi aplicación?
  • Buenas prácticas para la comunicación asíncrona entre servicios
  • Actualizar MusicPlayer SeekBar en servicio
  • El servicio de Android se detiene cuando se cierra la aplicación
  • Descargar varios archivos utilizando un servicio en android
  • ¿Puede existir un servicio de fondo sin su aplicación principal?
  • Uso de GoogleApiClient en un servicio
  • Cómo obtener detalles del proceso de ejecución de fondo android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.