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 🙂
- Registrador de clave de Android
- BroadcastReceiver - onReceive Not Being Called
- Preferencia en el oyente de cambio
- Notificaciones diarias a ciertas horas
- Cómo desvincular correctamente los servicios
- Desactivar ocultar una presentación (pantalla secundaria)
- REST / JSON / XML-RPC / SOAP
- Utilizar IExtendedNetworkService para obtener respuesta de USSD en Android
- Transmisión recibida dos veces
- Android: cómo obtener la intención recibida por un servicio?
- Paho MqttAndroidClient.connect siempre falla
- ¿Cómo usar loopJ SyncHttpClient para llamadas sincrónicas?
- Android Context.bindService devuelve siempre falso y el objeto ServiceConnection nunca se activa
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;
- Programaticamente obtener color del recurso utilizando ContextCompat que no ignora el calificador nocturno
- Copiar mensaje de advertencia cuando se pasa el cursor sobre un WORD en Android Studio mediante Mac