delphi xe10 android服务gps [复制]

delphi xe10 android服务gps [复制],第1张

概述参见英文答案>GetGPSlocationviaaserviceinAndroid                                    5个我正在使用EmabarcaderoDelphiXE10SeattleUpdate1来创建一个Android服务,我发现这个教程Link并创建了一个服务应用程序,我想做的是

参见英文答案 > Get GPS location via a service in Android                                    5个
我正在使用Emabarcadero Delphi XE 10 Seattle Update 1来创建一个AndroID服务,我发现这个教程Link并创建了一个服务应用程序,我想做的是使用Location Sensor每隔5秒获取一个当前位置并保存到数据库.我在我的主要表单上这样做但是当我关闭程序它停止时,所以我找不到任何关于如何同步我的应用程序和服务的文章.我试图将定时器和Locationsensor添加到服务表单但Delphi不允许我添加到服务表单任何对象,我想我需要发送命令服务或不知何故我需要连接服务和程序,我发现了一个示例这显示了如何使用服务下载图像,但对于像我这样的菜鸟来说它太专家了:)

解决方法:

看看this文章. DanIEle Spinetti使用LocationSensor解决问题.

将System.Sensors和System.AndroID.Sensors单元放入您的项目并进行更改(Delphi 10 Seattle).

System.Sensors.pas

// about line 748implementationuses  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 12uses  // -- patch   // use the modifIEd System.Sensors  System.Sensors;...// about line 70class 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 100type  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 1500constructor 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 1730class 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;
总结

以上是内存溢出为你收集整理的delphi xe10 android服务gps [复制]全部内容,希望文章能够帮你解决delphi xe10 android服务gps [复制]所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1118249.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存