android डेल्फी xe10 एंड्रॉइड सेवा जीपीएस




delphi service (2)

अगर टीटीमेर आपकी अपेक्षानुसार काम नहीं कर रहा है, तो अपने सब सामान को अज्ञात धागे में करने का प्रयास करें और TThread.CurrentThread.Sleep का उपयोग करें।

function TServiceModule.AndroidServiceStartCommand(const Sender: TObject;
  const Intent: JIntent; Flags, StartId: Integer): Integer;
begin
  Result := TJService.JavaClass.START_STICKY;

  TThread.CreateAnonymousThread(procedure
    begin
      repeat
        TThread.Current.Sleep(MSecsPerSec);
        TThread.CreateAnonymousThread(procedure
          DoStuff();
        end).Start;
        TThread.Current.Sleep(MSecsPerSec);
      until (TThread.Current.CheckTerminated);
    end).Start;
end;

https://code.i-harness.com

इस सवाल का पहले से ही उत्तर दिया गया है:

मैं एक एंड्रॉइड सेवा बनाने के लिए Emabarcadero Delphi XE 10 सिएटल अपडेट 1 का उपयोग कर रहा हूं, मैंने इस ट्यूटोरियल लिंक को पाया है और एक सर्विस एप्लीकेशन बनाया है, मैं क्या करना चाहता हूं स्थान सेंसर के साथ हर 5 सेकंड में वर्तमान स्थान प्राप्त होता है और डाटाबेस । मैं अपने मुख्य फ़ार्म पर ऐसा कर रहा हूं, लेकिन जब मैं प्रोग्राम बंद कर रहा हूं, तो मैं इसे बंद कर सकता हूं, इसलिए मैं इस बारे में कोई भी लेख नहीं देख पाया कि मैं अपने आवेदन और सेवा को कैसे संकालित कर सकता हूं। मैंने सेवा प्रपत्र के लिए टाइमर और स्थान जोडऩे जोड़ने का प्रयास किया है लेकिन डेल्फी मुझे किसी भी ऑब्जेक्ट सेवा प्रपत्र में जोड़ने की इजाजत नहीं दे रही है, मुझे लगता है मुझे सेवा के लिए कमांड भेजने की आवश्यकता है या किसी तरह मुझे सेवा और कार्यक्रम से जुड़ने की ज़रूरत है, मुझे एक नमूना मिला जो दिखाता है कि सेवा के साथ छवियों को कैसे डाउनलोड किया जाए लेकिन मेरे जैसे रंगरूटों के लिए बहुत विशेषज्ञ हैं :)


इस लेख को देखें डेनियल स्पिनेट्टी सेवा में स्थान सेंसर का उपयोग कर समस्या को हल करती है।

सिस्टम डालें। सेंसर और सिस्टम। एंड्रॉइड। सेंसर अपने प्रोजेक्ट में इकाइयां और परिवर्तन करें (डेल्फी 10 सिएटल)।

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;

उसके बाद आप इस तरह LocationSensor का उपयोग कर सकते हैं:

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;




gps