参见英文答案 > 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 [复制]所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)