华测compass下载 sensor中time是可以自己测出来的吗

Android实例-OrientationSensor方向传感器(XE8+小米2) - 疯狂delphi - 博客园
delphiXE7、XE8、XE10公开课A 群号: QQ: 朱建强
相关资料:
《修复 XE8 for Android 方向传感器 headingX,Y,Z 不会动的问题》:/onechen/p/4497282.html
1.用XE8的话,会有个问题,就是Heading的值不刷新,一直是0。不过网上有修改方法,此文章也收录了一下。在本文中搜索&Heading的值不刷新begin&可以查看修改了什么。
实例代码:
1 unit Unit1;
3 interface
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, System.Sensors,
FMX.Controls.Presentation, FMX.StdCtrls, ponents,
TForm1 = class(TForm)
OrientationSensor1: TOrientationS
Label1: TL
Layout1: TL
Layout2: TL
Switch1: TS
Label2: TL
Label3: TL
Label4: TL
Label5: TL
Label6: TL
Label7: TL
SpeedButton1: TSpeedB
SpeedButton2: TSpeedB
Timer1: TT
procedure OrientationSensor1SensorChoosing(Sender: TO
const Sensors: TSensorA var ChoseSensorIndex: Integer);
procedure SpeedButton1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
procedure Switch1Click(Sender: TObject);
{ Private declarations }
{ Public declarations }
Form1: TForm1;
43 implementation
45 {$R *.fmx}
46 {$R *.NmXhdpiPh.fmx ANDROID}
48 procedure TForm1.FormActivate(Sender: TObject);
{$IFDEF IOS}
{$IFNDEF CPUARM}
lbOrientationSensor.Text := 'Simulator - no sensors';
Switch1.Enabled := F
58 //Tilt与Heading的切换
59 procedure TForm1.OrientationSensor1SensorChoosing(Sender: TO
const Sensors: TSensorA var ChoseSensorIndex: Integer);
Found := -1;
for I := 0 to High(Sensors) do
if SpeedButton1.IsPressed and (TCustomOrientationSensor.TProperty.TiltX in TCustomOrientationSensor(Sensors[I]).AvailableProperties) then
Found := I;
else if SpeedButton2.IsPressed and (TCustomOrientationSensor.TProperty.HeadingX in TCustomOrientationSensor(Sensors[I]).AvailableProperties) then
Found := I;
if Found & 0 then
Found := 0;
SpeedButton1.IsPressed := T
SpeedButton2.IsPressed := F
ShowMessage('Compass(电子罗盘) not(不) available(可用)');
ChoseSensorIndex := F
89 //Tilt刷新
90 procedure TForm1.SpeedButton1Click(Sender: TObject);
OrientationSensor1.Active := F
SpeedButton2.IsPressed := F
SpeedButton1.IsPressed := T
OrientationSensor1.Active := Switch1.IsC
98 //Heading刷新
99 procedure TForm1.SpeedButton2Click(Sender: TObject);
OrientationSensor1.Active := F
SpeedButton1.IsPressed := F
SpeedButton2.IsPressed := T
OrientationSensor1.Active := Switch1.IsC
107 //显示开关
108 procedure TForm1.Switch1Click(Sender: TObject);
OrientationSensor1.Active := Switch1.IsC
Timer1.Enabled:= Switch1.IsC
114 //取值方法
115 procedure TForm1.Timer1Timer(Sender: TObject);
Label2.Text := Format('Tilt X: %f', [OrientationSensor1.Sensor.TiltX]);
Label3.Text := Format('Tilt Y: %f', [OrientationSensor1.Sensor.TiltY]);
Label4.Text := Format('Tilt Z: %f', [OrientationSensor1.Sensor.TiltZ]);
Label5.Text := Format('Heading X: %f', [OrientationSensor1.Sensor.HeadingX]);
Label6.Text := Format('Heading Y: %f', [OrientationSensor1.Sensor.HeadingY]);
Label7.Text := Format('Heading Z: %f', [OrientationSensor1.Sensor.HeadingZ]);
自带单元(System.Android.Sensors.pas&):
1 {*******************************************************}
CodeGear Delphi Runtime Library
4 { Copyright(c)
Embarcadero Technologies, Inc. }
6 {*******************************************************}
8 unit System.Android.S
10 interface
TPlatformSensorManager = class(TSensorManager)
class function GetSensorManager: TSensorM override;
TPlatformGeocoder = class(TGeocoder)
class function GetGeocoderImplementer: TGeocoderC override;
TPlatformGpsStatus = class(TGpsStatus)
class function GetGpsStatusImplementer: TGpsStatusC override;
31 implementation
System.SysUtils,
Androidapi.Sensor, Androidapi.AppGlue, Androidapi.Looper, System.Math, Androidapi.Jni,
Androidapi.JNIBridge, Androidapi.JNI.Location, Androidapi.JNI.JavaTypes,
Androidapi.JNI.Os, Androidapi.JNI.App, Androidapi.NativeActivity,
Androidapi.JNI.GraphicsContentViewText, Androidapi.H
40 { Permissions manager }
TPermission = class
class var FPermissions: TJavaObjectArray&JString&;
class constructor Create;
class destructor Destroy;
class function IsPermitted(const APermission: JString):B
class function GetList: TJavaObjectArray&JString&;
53 { TPermission }
55 class function TPermission.IsPermitted(const APermission: JString): B
Result := F
for I := 0 to FPermissions.Length - 1 do
if FPermissions[i].equalsIgnoreCase(APermission) then
Result := T
68 class constructor TPermission.Create;
PackageInfo: JPackageI
PackageManager: JPackageM
Activity: JA
Activity := TJNativeActivity.Wrap(PANativeActivity(System.DelphiActivity)^.clazz);
PackageManager := Activity.getPackageM
PackageInfo := PackageManager.getPackageInfo(Activity.getPackageName, TJPackageManager.JavaClass.GET_PERMISSIONS);
FPermissions := PackageInfo.requestedP
80 class destructor TPermission.Destroy;
85 class function TPermission.GetList: TJavaObjectArray&JString&;
Result := FP
TAndroidGeocoder = class(TGeocoder)
TGeocoderRunnable = class(TJavaLocal, JRunnable)
FCoord: TLocationCoord2D;
FLGeocoder: JG
constructor Create(ACoord: TLocationCoord2D; AGeocoder: JGeocoder);
procedure cdecl;
private class var
FGeocoder: JG
FActivity: JA
class constructor Create;
class destructor Destroy;
class function GetGeocoderImplementer: TGeocoderC override;
class procedure GeocodeRequest(const AAddress: TCivicAddress); override;
class procedure GeocodeReverseRequest(const Coords: TLocationCoord2D); override;
class function Supported: B override;
class function Authorized: TAuthorizationT override;
class procedure C override;
TUIAndroidLocationSensor = class(TCustomLocationSensor)
FPermitted: B
FActivity: JNativeA
FLastValue: JL
FLocationManager: JLocationM
FAccuracy: TLocationA
FDistance: TLocationD
TLocationListener = class(TJavaLocal, JLocationListener)
FLocationSensor: TUIAndroidLocationS
constructor Create(ALocationSensor: TUIAndroidLocationSensor);
procedure onLocationChanged(P1: JLocation); cdecl;
procedure onStatusChanged(P1: JS P2: I P3: JBundle); cdecl;
procedure onProviderEnabled(P1: JString); cdecl;
procedure onProviderDisabled(P1: JString); cdecl;
TLocationRunnable = class(TJavaLocal, JRunnable)
FLocationManager: JLocationM
FListener: TLocationL
FProvider: JS
constructor Create(ALocationManager: JLocationM AListener: TLocationL AProvider: JString);
procedure cdecl;
FGPSListener: TLocationL
FGPSRunner: TLocationR
FNetworkListener: TLocationL
FNetworkRunner: TLocationR
FPassiveListener: TLocationL
FPassiveRunner: TLocationR
function DoStart: B override;
procedure DoS override;
function GetLocationSensorType: TLocationSensorT override;
function GetAvailableProperties: TCustomLocationSensor.TP override;
function GetDoubleProperty(Prop: TCustomLocationSensor.TProperty): D override;
function GetStringProperty(Prop: TCustomLocationSensor.TProperty): string; override;
function GetSensorCategory: TSensorC override;
function GetState: TSensorS override;
function GetTimeStamp: TDateT override;
procedure DoO override;
function GetAuthorized: TAuthorizationT override;
function GetAccuracy: TLocationA override;
function GetDistance: TLocationD override;
function GetPowerConsumption: TPowerC override;
procedure SetAccuracy(const Value: TLocationAccuracy); override;
procedure SetDistance(const Value: TLocationDistance); override;
procedure DoLocationChangeT override;
constructor Create(AManager: TSensorManager); override;
function Supported: B
TNativeSensor = class
strict private
FSensorType: I
FSensorManager: PASensorM
FNativeSensor: PAS
FNativeEventQueue: PASensorEventQ
FLastSensorEvent: ASensorE
FUpdateInterval: D
function GetInterval: D
procedure SetInterval(const Value: Double);
class function NativeCallBack(FileDescriptor, Events: I Data: Pointer): I cdecl;
constructor Create(SensorType: Integer);
function Supported: B
function LastValue: ASensorE
property UpdateInterval: Double read GetInterval write SetI
function DoStart: B
procedure DoS
function TimeStamp: D
TAndroidNativeSensor = class(TCustomSensor)
strict private
FNativeSensor: TNativeS
function GetSensorCategory: TSensorC
function GetState: TSensorS
function GetTimeStamp: TDateT
function GetDoubleProperty(Prop: TProperty): D
constructor Create(AManager: TSensorManager);
function Supported: B
TAndroidNativeGravitySensor = class(TCustomMotionSensor)
strict private
FNativeSensor: TNativeS
function GetMotionSensorType: TMotionSensorT override;
function GetAvailableProperties: TCustomMotionSensor.TP override;
function DoStart: B override;
procedure DoS override;
function GetSensorCategory: TSensorC override;
function GetState: TSensorS override;
function GetTimeStamp: TDateT override;
function GetDoubleProperty(Prop: TCustomMotionSensor.TProperty): D override;
function GetUpdateInterval: D
procedure SetUpdateInterval(AInterval: Double); override;
constructor Create(AManager: TSensorManager); override;
function Supported: B
TAndroidNativeLinearAccelerometrSensor = class(TCustomMotionSensor)
strict private
FNativeSensor: TNativeS
function GetMotionSensorType: TMotionSensorT override;
function GetAvailableProperties: TCustomMotionSensor.TP override;
function DoStart: B override;
procedure DoS override;
function GetSensorCategory: TSensorC override;
function GetState: TSensorS override;
function GetTimeStamp: TDateT override;
function GetDoubleProperty(Prop: TCustomMotionSensor.TProperty): D override;
function GetUpdateInterval: D
procedure SetUpdateInterval(AInterval: Double); override;
constructor Create(AManager: TSensorManager); override;
function Supported: B
TAndroidNativeHumiditySensor = class(TCustomEnvironmentalSensor)
strict private
FNativeSensor: TNativeS
function GetSensorCategory: TSensorC override;
function GetState: TSensorS override;
function GetTimeStamp: TDateT override;
function GetDoubleProperty(Prop: TCustomEnvironmentalSensor.TProperty): D override;
function GetEnvironmentalSensorType: TEnvironmentalSensorT override;
function GetAvailableProperties: TCustomEnvironmentalSensor.TP override;
constructor Create(AManager: TSensorManager); override;
function Supported: B
TAndroidNativeTemperatureSensor = class(TCustomEnvironmentalSensor)
strict private
FNativeSensor: TNativeS
function GetSensorCategory: TSensorC override;
function GetState: TSensorS override;
function GetTimeStamp: TDateT override;
function GetDoubleProperty(Prop: TCustomEnvironmentalSensor.TProperty): D override;
function GetEnvironmentalSensorType: TEnvironmentalSensorT override;
function GetAvailableProperties: TCustomEnvironmentalSensor.TP override;
constructor Create(AManager: TSensorManager); override;
function Supported: B
TAndroidNativeProximitySensor = class(TCustomBiometricSensor)
strict private
FNativeSensor: TNativeS
function GetBiometricSensorType: TBiometricSensorT override;
function GetSensorCategory: TSensorC override;
function GetState: TSensorS override;
function GetTimeStamp: TDateT override;
function GetAvailableProperties: TCustomBiometricSensor.TP override;
function GetDoubleProperty(Prop: TCustomBiometricSensor.TProperty): D override;
constructor Create(AManager: TSensorManager); override;
function Supported: B
TAndroidNativeMagneticSensor = class(TCustomOrientationSensor)
strict private
FNativeSensor: TNativeS
function GetUpdateInterval: D
procedure SetUpdateInterval(AInterval: Double); override;
function GetOrientationSensorType: TOrientationSensorT override;
//Heading的值不刷新begin
function DoStart: B override;
procedure DoS override;
//Heading的值不刷新end
function GetSensorCategory: TSensorC override;
function GetState: TSensorS override;
function GetTimeStamp: TDateT override;
function GetAvailableProperties: TCustomOrientationSensor.TP override;
function GetDoubleProperty(Prop: TCustomOrientationSensor.TProperty): D override;
constructor Create(AManager: TSensorManager); override;
function Supported: B
TAndroidNativePressureSensor = class(TCustomEnvironmentalSensor)
strict private
FNativeSensor: TNativeS
function GetSensorCategory: TSensorC override;
function GetState: TSensorS override;
function GetTimeStamp: TDateT override;
function GetEnvironmentalSensorType: TEnvironmentalSensorT override;
function GetAvailableProperties: TCustomEnvironmentalSensor.TP override;
function GetDoubleProperty(Prop: TCustomEnvironmentalSensor.TProperty): D override;
constructor Create(AManager: TSensorManager); override;
function Supported: B
TAndroidNativeLightSensor = class(TCustomLightSensor)
strict private
FNativeSensor: TNativeS
function GetLightSensorType: TLightSensorT override;
function GetAvailableProperties: TCustomLightSensor.TP override;
function GetDoubleProperty(Prop: TCustomLightSensor.TProperty): D override;
function GetSensorCategory: TSensorC override;
function GetState: TSensorS override;
function GetTimeStamp: TDateT override;
constructor Create(AManager: TSensorManager); override;
function Supported: B
TAndroidNativeAccelerometrSensor = class(TCustomMotionSensor)
strict private
FNativeSensor: TNativeS
function GetMotionSensorType: TMotionSensorT override;
function GetAvailableProperties: TCustomMotionSensor.TP override;
function DoStart: B override;
procedure DoS override;
function GetSensorCategory: TSensorC override;
function GetState: TSensorS override;
function GetTimeStamp: TDateT override;
function GetDoubleProperty(Prop: TCustomMotionSensor.TProperty): D override;
function GetUpdateInterval: D
procedure SetUpdateInterval(AInterval: Double); override;
constructor Create(AManager: TSensorManager); override;
function Supported: B
TAndroidNativeRotationSensor = class(TCustomOrientationSensor)
FNativeSensor: TNativeS
constructor Create(AManager: TSensorManager); override;
function Supported: B
function GetOrientationSensorType: TOrientationSensorT override;
function GetAvailableProperties: TCustomOrientationSensor.TP
function GetDoubleProperty(Prop: TCustomOrientationSensor.TProperty): D
function GetSensorCategory: TSensorC override;
function GetUpdateInterval: D
procedure SetUpdateInterval(AInterval: Double); override;
function DoStart: B override;
procedure DoS override;
function GetState: TSensorS override;
function GetTimeStamp: TDateT override;
TAndroidNativeGyroscopeSensor = class(TCustomMotionSensor)
FNativeSensor: TNativeS
constructor Create(AManager: TSensorManager); override;
function Supported: B
function GetMotionSensorType: TMotionSensorT override;
function GetAvailableProperties: TCustomMotionSensor.TP
function GetDoubleProperty(Prop: TCustomMotionSensor.TProperty): D
function GetSensorCategory: TSensorC override;
function GetUpdateInterval: D
procedure SetUpdateInterval(AInterval: Double); override;
function DoStart: B override;
procedure DoS override;
function GetState: TSensorS override;
function GetTimeStamp: TDateT override;
TAndroidSensorManager = class(TPlatformSensorManager)
FActive: B
FSensorManager: PASensorM
function GetCanActivate: B override;
function GetActive: B override;
constructor Create;
destructor Destroy; override;
procedure A override;
procedure D override;
419 { TAndroidSensorManager }
421 procedure TAndroidSensorManager.A
Accelerator: TAndroidNativeAccelerometrS
Orientation: TAndroidNativeGyroscopeS
Light: TAndroidNativeLightS
Pressure: TAndroidNativePressureS
MagneticField: TAndroidNativeMagneticS
Proximity: TAndroidNativeProximityS
Rotation: TAndroidNativeRotationS
Temperature: TAndroidNativeTemperatureS
Humidity: TAndroidNativeHumidityS
Gravity: TAndroidNativeGravityS
LinearAcceleration: TAndroidNativeLinearAccelerometrS
Location: TUIAndroidLocationS
if not Active then
FActive := T
Accelerator := TAndroidNativeAccelerometrSensor.Create(Self);
if not Accelerator.Supported then
RemoveSensor(Accelerator);
Orientation := TAndroidNativeGyroscopeSensor.Create(Self);
if not Orientation.Supported then
RemoveSensor(Orientation);
Light := TAndroidNativeLightSensor.Create(Self);
if not Light.Supported then
RemoveSensor(Light);
Pressure := TAndroidNativePressureSensor.Create(Self);
if not Pressure.Supported then
RemoveSensor(Pressure);
MagneticField := TAndroidNativeMagneticSensor.Create(Self);
if not MagneticField.Supported then
RemoveSensor(MagneticField);
Proximity := TAndroidNativeProximitySensor.Create(Self);
if not Proximity.Supported then
RemoveSensor(Proximity);
Rotation := TAndroidNativeRotationSensor.Create(Self);
if not Rotation.Supported then
RemoveSensor(Rotation);
Temperature := TAndroidNativeTemperatureSensor.Create(Self);
if not Temperature.Supported then
RemoveSensor(Temperature);
Humidity := TAndroidNativeHumiditySensor.Create(Self);
if not Humidity.Supported then
RemoveSensor(Humidity);
Gravity := TAndroidNativeGravitySensor.Create(Self);
if not Gravity.Supported then
RemoveSensor(Gravity);
LinearAcceleration := TAndroidNativeLinearAccelerometrSensor.Create(Self);
if not LinearAcceleration.Supported then
RemoveSensor(LinearAcceleration);
Location := TUIAndroidLocationSensor.Create(Self);
if not Location.Supported then
RemoveSensor(Location);
490 constructor TAndroidSensorManager.Create;
inherited;
FSensorManager := ASensorManager_getI
FActive := F
497 procedure TAndroidSensorManager.D
FActive := F
for I := Count - 1 downto 0 do
RemoveSensor(Sensors[I]);
506 destructor TAndroidSensorManager.Destroy;
inherited;
511 function TAndroidSensorManager.GetActive: B
Result := FA
516 function TAndroidSensorManager.GetCanActivate: B
Result := Assigned(FSensorManager);
521 { TAndroidCustomSensor }
523 constructor TAndroidNativeAccelerometrSensor.Create(AManager: TSensorManager);
inherited;
FNativeSensor := TNativeSensor.Create(ASENSOR_TYPE_ACCELEROMETER);
530 function TAndroidNativeAccelerometrSensor.DoStart: B
Result := FNativeSensor.DoS
535 procedure TAndroidNativeAccelerometrSensor.DoS
inherited;
FNativeSensor.DoS
541 function TAndroidNativeAccelerometrSensor.GetAvailableProperties: TCustomMotionSensor.TP
Result := [TCustomMotionSensor.TProperty.AccelerationX, TCustomMotionSensor.TProperty.AccelerationY,
TCustomMotionSensor.TProperty.AccelerationZ]
547 function TAndroidNativeAccelerometrSensor.GetDoubleProperty(
Prop: TCustomMotionSensor.TProperty): D
case Prop of
TCustomMotionSensor.TProperty.AccelerationX: Result := -1 * FNativeSensor.LastValue.acceleration.x / ASENSOR_STANDARD_GRAVITY;
TCustomMotionSensor.TProperty.AccelerationY: Result := -1 * FNativeSensor.LastValue.acceleration.y / ASENSOR_STANDARD_GRAVITY;
TCustomMotionSensor.TProperty.AccelerationZ: Result := -1 * FNativeSensor.LastValue.acceleration.z / ASENSOR_STANDARD_GRAVITY;
Result := NaN;
559 function TAndroidNativeAccelerometrSensor.GetMotionSensorType: TMotionSensorT
Result := TMotionSensorType.Accelerometer3D;
564 function TAndroidNativeAccelerometrSensor.GetSensorCategory: TSensorC
Result := TSensorCategory.M
569 function TAndroidNativeAccelerometrSensor.GetState: TSensorS
if Supported then
Result := TSensorState.Ready
Result := TSensorState.NoD
577 function TAndroidNativeAccelerometrSensor.GetTimeStamp: TDateT
Result := FNativeSensor.TimeS
582 function TAndroidNativeAccelerometrSensor.GetUpdateInterval: D
Result := FNativeSensor.UpdateI
587 procedure TAndroidNativeAccelerometrSensor.SetUpdateInterval(AInterval: Double);
if Supported then
FNativeSensor.UpdateInterval := AI
593 function TAndroidNativeAccelerometrSensor.Supported: B
Result := FNativeSensor.S
598 { TPlatformSensorManager }
600 class function TPlatformSensorManager.GetSensorManager: TSensorM
Result := TAndroidSensorManager.Create;
605 { TPlatformGeocoder }
607 class function TPlatformGeocoder.GetGeocoderImplementer: TGeocoderC
Result := TAndroidG
612 { TPlatformGpsStatus }
614 class function TPlatformGpsStatus.GetGpsStatusImplementer: TGpsStatusC
Result := nil;
621 constructor TAndroidNativeGyroscopeSensor.Create(AManager: TSensorManager);
inherited;
FNativeSensor := TNativeSensor.Create(ASENSOR_TYPE_GYROSCOPE);
627 function TAndroidNativeGyroscopeSensor.DoStart: B
Result := FNativeSensor.DoS
632 procedure TAndroidNativeGyroscopeSensor.DoS
inherited;
FNativeSensor.DoS
638 function TAndroidNativeGyroscopeSensor.GetAvailableProperties: TCustomMotionSensor.TP
Result := [TCustomMotionSensor.TProperty.AngleAccelX, TCustomMotionSensor.TProperty.AngleAccelY, TCustomMotionSensor.TProperty.AngleAccelZ];
643 function TAndroidNativeGyroscopeSensor.GetDoubleProperty(
Prop: TCustomMotionSensor.TProperty): D
case Prop of
TCustomMotionSensor.TProperty.AngleAccelX: Result := FNativeSensor.LastValue.vector.x;
TCustomMotionSensor.TProperty.AngleAccelY: Result := FNativeSensor.LastValue.vector.y;
TCustomMotionSensor.TProperty.AngleAccelZ: Result := FNativeSensor.LastValue.vector.z;
Result := NaN;
655 function TAndroidNativeGyroscopeSensor.GetMotionSensorType: TMotionSensorT
Result := TMotionSensorType.Gyrometer3D;
660 function TAndroidNativeGyroscopeSensor.GetSensorCategory: TSensorC
Result := TSensorCategory.M
665 function TAndroidNativeGyroscopeSensor.GetState: TSensorS
if FNativeSensor.Supported then
Result := TSensorState.Ready
Result := TSensorState.NoD
673 function TAndroidNativeGyroscopeSensor.GetTimeStamp: TDateT
Result := FNativeSensor.TimeS
678 function TAndroidNativeGyroscopeSensor.GetUpdateInterval: D
Result := FNativeSensor.UpdateI
683 procedure TAndroidNativeGyroscopeSensor.SetUpdateInterval(AInterval: Double);
inherited;
FNativeSensor.UpdateInterval := AI
689 function TAndroidNativeGyroscopeSensor.Supported: B
Result := FNativeSensor.S
694 { TNativeSensor }
696 constructor TNativeSensor.Create(SensorType: Integer);
FSensorType := SensorT
FSensorManager := ASensorManager_getI
FNativeSensor := ASensorManager_getDefaultSensor(FSensorManager, SensorType);
FNativeEventQueue := ASensorManager_createEventQueue(FSensorManager, ALooper_forThread, LOOPER_ID_USER,
nil, nil);
SetInterval(1000);
706 function TNativeSensor.DoStart: B
Result := T
if Supported then
ASensorEventQueue_enableSensor(FNativeEventQueue,FNativeSensor);
713 procedure TNativeSensor.DoS
ASensorEventQueue_disableSensor(FNativeEventQueue,FNativeSensor);
718 function TNativeSensor.GetInterval: D
Result := FUpdateI
723 function TNativeSensor.LastValue: ASensorE
SensorEvent: ASensorE
while ASensorEventQueue_getEvents(FNativeEventQueue, @SensorEvent,1) & 0 do
FLastSensorEvent := SensorE
Result := FLastSensorE
732 class function TNativeSensor.NativeCallBack(FileDescriptor, Events: I Data: Pointer): I
UnregisteredFromTheLooper = 0;
ContinueReceivingCallbacks = 1;
Result := ContinueReceivingC
740 procedure TNativeSensor.SetInterval(const Value: Double);
if Supported then
FUpdateInterval := V
ASensorEventQueue_setEventRate(FNativeEventQueue,FNativeSensor,Round(FUpdateInterval));
749 function TNativeSensor.Supported: B
Result := Assigned(FNativeSensor) and Assigned(FNativeEventQueue);
754 function TNativeSensor.TimeStamp: D
Result := NaN;
if Supported then
Result := FLastSensorEvent.
761 { TAndroidNativeLightSensor }
763 constructor TAndroidNativeLightSensor.Create(AManager: TSensorManager);
inherited;
FNativeSensor := TNativeSensor.Create(ASENSOR_TYPE_LIGHT);
769 function TAndroidNativeLightSensor.GetAvailableProperties: TCustomLightSensor.TP
Result := [TCustomLightSensor.TProperty.Lux];
774 function TAndroidNativeLightSensor.GetDoubleProperty(Prop: TCustomLightSensor.TProperty): D
case Prop of
TCustomLightSensor.TProperty.Lux: Result := FNativeSensor.LastValue.
Result := NaN;
783 function TAndroidNativeLightSensor.GetLightSensorType: TLightSensorT
Result := TLightSensorType.AmbientL
788 function TAndroidNativeLightSensor.GetSensorCategory: TSensorC
Result := TSensorCategory.L
793 function TAndroidNativeLightSensor.GetState: TSensorS
if FNativeSensor.Supported then
Result := TSensorState.Ready
Result := TSensorState.NoD
801 function TAndroidNativeLightSensor.GetTimeStamp: TDateT
Result := FNativeSensor.TimeS
806 function TAndroidNativeLightSensor.Supported: B
Result := FNativeSensor.S
811 { TAndroidNativePressureSensor }
813 constructor TAndroidNativePressureSensor.Create(AManager: TSensorManager);
inherited;
FNativeSensor := TNativeSensor.Create(ASENSOR_TYPE_PRESSURE);
819 function TAndroidNativePressureSensor.GetAvailableProperties: TCustomEnvironmentalSensor.TP
Result := [TCustomEnvironmentalSensor.TProperty.Pressure];
824 function TAndroidNativePressureSensor.GetDoubleProperty(
Prop: TCustomEnvironmentalSensor.TProperty): D
case Prop of
Atmospheric pressure in hPa (millibar)
TCustomEnvironmentalSensor.TProperty.Pressure: Result := FNativeSensor.LastValue.
Result := NaN;
835 function TAndroidNativePressureSensor.GetEnvironmentalSensorType: TEnvironmentalSensorT
Result := TEnvironmentalSensorType.AtmosphericP
840 function TAndroidNativePressureSensor.GetSensorCategory: TSensorC
Result := TSensorCategory.E
845 function TAndroidNativePressureSensor.GetState: TSensorS
if Supported then
Result := TSensorState.Ready
Result := TSensorState.NoD
853 function TAndroidNativePressureSensor.GetTimeStamp: TDateT
Result := FNativeSensor.TimeS
858 function TAndroidNativePressureSensor.Supported: B
Result := FNativeSensor.S
863 { TAndroidNativeMagneticSensor }
865 constructor TAndroidNativeMagneticSensor.Create(AManager: TSensorManager);
inherited;
FNativeSensor := TNativeSensor.Create(ASENSOR_TYPE_MAGNETIC_FIELD);
871 //Heading的值不刷新begin
872 function TAndroidNativeMagneticSensor.DoStart: B
Result := FNativeSensor.DoS
877 procedure TAndroidNativeMagneticSensor.DoS
inherited;
FNativeSensor.DoS
882 //Heading的值不刷新end
884 function TAndroidNativeMagneticSensor.GetAvailableProperties: TCustomOrientationSensor.TP
Result := [TCustomOrientationSensor.TProperty.HeadingX, TCustomOrientationSensor.TProperty.HeadingY,
TCustomOrientationSensor.TProperty.HeadingZ];
890 function TAndroidNativeMagneticSensor.GetDoubleProperty(
Prop: TCustomOrientationSensor.TProperty): D
case Prop of
// All values are in micro-Tesla (uT) and measure the ambient magnetic field in the X, Y and Z axis.
TCustomOrientationSensor.TProperty.HeadingX: Result := FNativeSensor.LastValue.magnetic.x;
TCustomOrientationSensor.TProperty.HeadingY: Result := FNativeSensor.LastValue.magnetic.y;
TCustomOrientationSensor.TProperty.HeadingZ: Result := FNativeSensor.LastValue.magnetic.z;
Result := NaN;
903 function TAndroidNativeMagneticSensor.GetOrientationSensorType: TOrientationSensorT
Result := pass3D;
908 function TAndroidNativeMagneticSensor.GetSensorCategory: TSensorC
Result := TSensorCategory.O
913 function TAndroidNativeMagneticSensor.GetState: TSensorS
if Supported then
Result := TSensorState.Ready
Result := TSensorState.NoD
921 function TAndroidNativeMagneticSensor.GetTimeStamp: TDateT
Result := FNativeSensor.TimeS
926 function TAndroidNativeMagneticSensor.GetUpdateInterval: D
Result := FNativeSensor.UpdateI
931 procedure TAndroidNativeMagneticSensor.SetUpdateInterval(AInterval: Double);
inherited;
FNativeSensor.UpdateInterval := AI
937 function TAndroidNativeMagneticSensor.Supported: B
Result := FNativeSensor.S
942 { TAndroidNativeProximitySensor }
944 constructor TAndroidNativeProximitySensor.Create(AManager: TSensorManager);
inherited;
FNativeSensor := TNativeSensor.Create(ASENSOR_TYPE_PROXIMITY);
950 function TAndroidNativeProximitySensor.GetAvailableProperties: TCustomBiometricSensor.TP
Result := [TCustomBiometricSensor.TProperty.HumanProximity];
955 function TAndroidNativeProximitySensor.GetBiometricSensorType: TBiometricSensorT
Result := TBiometricSensorType.HumanP
960 function TAndroidNativeProximitySensor.GetDoubleProperty(
Prop: TCustomBiometricSensor.TProperty): D
case Prop of
// Proximity sensor distance measured in centimeters
TCustomBiometricSensor.TProperty.HumanProximity:
Result := FNativeSensor.LastValue.
Result := NaN;
974 function TAndroidNativeProximitySensor.GetSensorCategory: TSensorC
Result := TSensorCategory.B
979 function TAndroidNativeProximitySensor.GetState: TSensorS
if Supported then
Result := TSensorState.Ready
Result := TSensorState.NoD
987 function TAndroidNativeProximitySensor.GetTimeStamp: TDateT
Result := FNativeSensor.TimeS
992 function TAndroidNativeProximitySensor.Supported: B
Result := FNativeSensor.S
997 { TAndroidNativeRotationSensor }
999 constructor TAndroidNativeRotationSensor.Create(AManager: TSensorManager);
1000 begin
inherited;
FNativeSensor := TNativeSensor.Create(ASENSOR_TYPE_ROTATION_VECTOR);
1005 function TAndroidNativeRotationSensor.DoStart: B
1006 begin
Result := FNativeSensor.DoS
1010 procedure TAndroidNativeRotationSensor.DoS
1011 begin
inherited;
FNativeSensor.DoS
1016 function TAndroidNativeRotationSensor.GetAvailableProperties: TCustomOrientationSensor.TP
1017 begin
Result := [TCustomOrientationSensor.TProperty.TiltX, TCustomOrientationSensor.TProperty.TiltY, TCustomOrientationSensor.TProperty.TiltZ];
1021 function TAndroidNativeRotationSensor.GetDoubleProperty(Prop: TCustomOrientationSensor.TProperty): D
Tilts: ASensorV
function VectorToAngles(const RotationVector: ASensorVector): ASensorV
RM: array[0..8] of D
sqX, sqY, sqZ, qXY, qZL, qXZ, qYL, qYZ, qXL: D
sqX := RotationVector.x * RotationVector.x;
sqY := RotationVector.y * RotationVector.y;
sqZ := RotationVector.z * RotationVector.z;
Len := 1 - sqX - sqY - sqZ;
if Len & 0 then
Len := Sqrt(Len)
sqX := 2 * sqX;
sqY := 2 * sqY;
sqZ := 2 * sqZ;
qXY := 2 * RotationVector.x * RotationVector.y;
qZL := 2 * RotationVector.z * L
qXZ := 2 * RotationVector.x * RotationVector.z;
qYL := 2 * RotationVector.y * L
qYZ := 2 * RotationVector.y * RotationVector.z;
qXL := 2 * RotationVector.x * L
RM[0] := 1 - sqY - sqZ;
RM[1] := qXY - qZL;
RM[2] := qXZ + qYL;
RM[3] := qXY + qZL;
RM[4] := 1 - sqX - sqZ;
RM[5] := qYZ - qXL;
RM[6] := qXZ - qYL;
RM[7] := qYZ + qXL;
RM[8] := 1 - sqX - sqY;
Result.azimuth := RadToDeg(ArcTan2( RM[1], RM[4]));
Result.pitch := RadToDeg(ArcCos( - RM[7]) - Pi / 2);
Result.roll := RadToDeg(ArcTan2( - RM[6], RM[8]));
1066 begin
Tilts := VectorToAngles(FNativeSensor.LastValue.vector);
case Prop of
TCustomOrientationSensor.TProperty.TiltX: Result := Tilts.
TCustomOrientationSensor.TProperty.TiltY: Result := Tilts.
TCustomOrientationSensor.TProperty.TiltZ: Result := Tilts.
Result := NaN;
1077 function TAndroidNativeRotationSensor.GetOrientationSensorType: TOrientationSensorT
1078 begin
Result := TOrientationSensorType.Inclinometer3D;
1082 function TAndroidNativeRotationSensor.GetSensorCategory: TSensorC
1083 begin
Result := TSensorCategory.O
1087 function TAndroidNativeRotationSensor.GetState: TSensorS
1088 begin
if FNativeSensor.Supported then
Result := TSensorState.Ready
Result := TSensorState.NoD
1095 function TAndroidNativeRotationSensor.GetTimeStamp: TDateT
1096 begin
Result := FNativeSensor.TimeS
1100 function TAndroidNativeRotationSensor.GetUpdateInterval: D
1101 begin
Result := FNativeSensor.UpdateI
1105 procedure TAndroidNativeRotationSensor.SetUpdateInterval(AInterval: Double);
1106 begin
inherited;
FNativeSensor.UpdateInterval := AI
1111 function TAndroidNativeRotationSensor.Supported: B
1112 begin
Result := FNativeSensor.S
1116 { TAndroidNativeTemperatureSensor }
1118 constructor TAndroidNativeTemperatureSensor.Create(AManager: TSensorManager);
1119 begin
inherited;
FNativeSensor := TNativeSensor.Create(ASENSOR_TYPE_AMBIENT_TEMPERATURE);
1124 function TAndroidNativeTemperatureSensor.GetAvailableProperties: TCustomEnvironmentalSensor.TP
1125 begin
Result := [TCustomEnvironmentalSensor.TProperty.Temperature];
1129 function TAndroidNativeTemperatureSensor.GetDoubleProperty(
Prop: TCustomEnvironmentalSensor.TProperty): D
1131 begin
case Prop of
// ambient (room) temperature in degree Celsius
TCustomEnvironmentalSensor.TProperty.Temperature: Result := FNativeSensor.LastValue.
Result := NaN;
1140 function TAndroidNativeTemperatureSensor.GetEnvironmentalSensorType: TEnvironmentalSensorT
1141 begin
Result := TEnvironmentalSensorType.T
1145 function TAndroidNativeTemperatureSensor.GetSensorCategory: TSensorC
1146 begin
Result := TSensorCategory.E
1150 function TAndroidNativeTemperatureSensor.GetState: TSensorS
1151 begin
if Supported then
Result := TSensorState.Ready
Result := TSensorState.NoD
1158 function TAndroidNativeTemperatureSensor.GetTimeStamp: TDateT
1159 begin
Result := FNativeSensor.TimeS
1163 function TAndroidNativeTemperatureSensor.Supported: B
1164 begin
Result := FNativeSensor.S
1168 { TAndroidNativeSensor }
1170 constructor TAndroidNativeHumiditySensor.Create(AManager: TSensorManager);
1171 begin
inherited;
FNativeSensor := TNativeSensor.Create(ASENSOR_TYPE_RELATIVE_HUMIDITY);
1176 function TAndroidNativeHumiditySensor.GetAvailableProperties: TCustomEnvironmentalSensor.TP
1177 begin
Result := [TCustomEnvironmentalSensor.TProperty.Humidity];
1181 function TAndroidNativeHumiditySensor.GetDoubleProperty(
Prop: TCustomEnvironmentalSensor.TProperty): D
1183 begin
case Prop of
// Relative ambient air humidity in percent
TCustomEnvironmentalSensor.TProperty.Humidity: Result := FNativeSensor.LastValue.vector.v[0];
Result := NaN;
1192 function TAndroidNativeHumiditySensor.GetEnvironmentalSensorType: TEnvironmentalSensorT
1193 begin
Result := TEnvironmentalSensorType.H
1197 function TAndroidNativeHumiditySensor.GetSensorCategory: TSensorC
1198 begin
Result := TSensorCategory.E
1202 function TAndroidNativeHumiditySensor.GetState: TSensorS
1203 begin
if Supported then
Result := TSensorState.Ready
Result := TSensorState.NoD
1210 function TAndroidNativeHumiditySensor.GetTimeStamp: TDateT
1211 begin
Result := FNativeSensor.TimeS
1215 function TAndroidNativeHumiditySensor.Supported: B
1216 begin
Result := FNativeSensor.S
1220 { TAndroidNativeGravitySensor }
1222 constructor TAndroidNativeGravitySensor.Create(AManager: TSensorManager);
1223 begin
inherited;
FNativeSensor := TNativeSensor.Create(ASENSOR_TYPE_GRAVITY);
1228 function TAndroidNativeGravitySensor.DoStart: B
1229 begin
Result := FNativeSensor.DoS
1233 procedure TAndroidNativeGravitySensor.DoS
1234 begin
inherited;
FNativeSensor.DoS
1239 function TAndroidNativeGravitySensor.GetAvailableProperties: TCustomMotionSensor.TP
1240 begin
Result := [TCustomMotionSensor.TProperty.AccelerationX, TCustomMotionSensor.TProperty.AccelerationY,
TCustomMotionSensor.TProperty.AccelerationZ]
1245 function TAndroidNativeGravitySensor.GetDoubleProperty(
Prop: TCustomMotionSensor.TProperty): D
1247 begin
case Prop of
TCustomMotionSensor.TProperty.AccelerationX: Result := -1 * FNativeSensor.LastValue.acceleration.x / ASENSOR_STANDARD_GRAVITY;
TCustomMotionSensor.TProperty.AccelerationY: Result := -1 * FNativeSensor.LastValue.acceleration.y / ASENSOR_STANDARD_GRAVITY;
TCustomMotionSensor.TProperty.AccelerationZ: Result := -1 * FNativeSensor.LastValue.acceleration.z / ASENSOR_STANDARD_GRAVITY;
Result := NaN;
1257 function TAndroidNativeGravitySensor.GetMotionSensorType: TMotionSensorT
1258 begin
Result := TMotionSensorType.GravityAccelerometer3D;
1262 function TAndroidNativeGravitySensor.GetSensorCategory: TSensorC
1263 begin
Result := TSensorCategory.M
1267 function TAndroidNativeGravitySensor.GetState: TSensorS
1268 begin
if Supported then
Result := TSensorState.Ready
Result := TSensorState.NoD
1275 function TAndroidNativeGravitySensor.GetTimeStamp: TDateT
1276 begin
Result := FNativeSensor.TimeS
1280 function TAndroidNativeGravitySensor.GetUpdateInterval: D
1281 begin
Result := FNativeSensor.UpdateI
1285 procedure TAndroidNativeGravitySensor.SetUpdateInterval(AInterval: Double);
1286 begin
inherited;
FNativeSensor.UpdateInterval := AI
1291 function TAndroidNativeGravitySensor.Supported: B
1292 begin
Result := FNativeSensor.S
1296 { TAndroidNativeLinearAccelerometrSensor }
1298 constructor TAndroidNativeLinearAccelerometrSensor.Create(
AManager: TSensorManager);
1300 begin
inherited;
FNativeSensor := TNativeSensor.Create(ASENSOR_TYPE_LINEAR_ACCELERATION);
1305 function TAndroidNativeLinearAccelerometrSensor.DoStart: B
1306 begin
Result := FNativeSensor.DoS
1310 procedure TAndroidNativeLinearAccelerometrSensor.DoS
1311 begin
inherited;
1316 function TAndroidNativeLinearAccelerometrSensor.GetAvailableProperties: TCustomMotionSensor.TP
1317 begin
Result := [TCustomMotionSensor.TProperty.AccelerationX, TCustomMotionSensor.TProperty.AccelerationY,
TCustomMotionSensor.TProperty.AccelerationZ]
1322 function TAndroidNativeLinearAccelerometrSensor.GetDoubleProperty(
Prop: TCustomMotionSensor.TProperty): D
1324 begin
case Prop of
TCustomMotionSensor.TProperty.AccelerationX: Result := -1 * FNativeSensor.LastValue.acceleration.x / ASENSOR_STANDARD_GRAVITY;
TCustomMotionSensor.TProperty.AccelerationY: Result := -1 * FNativeSensor.LastValue.acceleration.y / ASENSOR_STANDARD_GRAVITY;
TCustomMotionSensor.TProperty.AccelerationZ: Result := -1 * FNativeSensor.LastValue.acceleration.z / ASENSOR_STANDARD_GRAVITY;
Result := NaN;
1334 function TAndroidNativeLinearAccelerometrSensor.GetMotionSensorType: TMotionSensorT
1335 begin
Result := TMotionSensorType.LinearAccelerometer3D;
1339 function TAndroidNativeLinearAccelerometrSensor.GetSensorCategory: TSensorC
1340 begin
Result := TSensorCategory.M
1344 function TAndroidNativeLinearAccelerometrSensor.GetState: TSensorS
1345 begin
if Supported then
Result := TSensorState.Ready
Result := TSensorState.NoD
1352 function TAndroidNativeLinearAccelerometrSensor.GetTimeStamp: TDateT
1353 begin
Result := FNativeSensor.TimeS
1357 function TAndroidNativeLinearAccelerometrSensor.GetUpdateInterval: D
1358 begin
Result := FNativeSensor.UpdateI
1362 procedure TAndroidNativeLinearAccelerometrSensor.SetUpdateInterval(
AInterval: Double);
1364 begin
inherited;
FNativeSensor.UpdateInterval := AI
1369 function TAndroidNativeLinearAccelerometrSensor.Supported: B
1370 begin
Result := FNativeSensor.S
1374 { TUIAndroidLocationSensor.TLocationListener }
1376 constructor TUIAndroidLocationSensor.TLocationListener.Create(ALocationSensor: TUIAndroidLocationSensor);
1377 begin
inherited Create;
FLocationSensor := ALocationS
1382 procedure TUIAndroidLocationSensor.TLocationListener.onLocationChanged(P1: JLocation);
OldLocation, CurrentLocation: TLocationCoord2D;
Heading: TH
1387 begin
if Assigned(FLocationSensor.FLastValue) then
OldLocation.Create(FLocationSensor.FLastValue.getLatitude,
FLocationSensor.FLastValue.getLongitude)
OldLocation.Create(NaN,NaN);
CurrentLocation.Create(P1.getLatitude, P1.getLongitude);
FLocationSensor.FLastValue := P1;
FLocationSensor.DoLocationChanged(OldLocation, CurrentLocation);
if p1.hasBearing then
Heading.Azimuth := P1.getB
FLocationSensor.DoHeadingChanged(Heading);
1403 procedure TUIAndroidLocationSensor.TLocationListener.onProviderDisabled(
P1: JString);
1405 begin
1409 procedure TUIAndroidLocationSensor.TLocationListener.onProviderEnabled(
P1: JString);
1411 begin
1415 procedure TUIAndroidLocationSensor.TLocationListener.onStatusChanged(
P1: JS P2: I P3: JBundle);
1417 begin
1421 { TUIAndroidLocationSensor.TLocationRunnable }
1423 constructor TUIAndroidLocationSensor.TLocationRunnable.Create(ALocationManager: JLocationM AListener:
TLocationL AProvider: JString);
1425 begin
Inherited Create;
FLocationManager := ALocationM
FListener := AL
FProvider := AP
1432 procedure TUIAndroidLocationSensor.TLocationRunnable.
1433 const
cMinTime = 100;
cMinDistance = 10;
1436 begin
FLocationManager.requestLocationUpdates( FProvider, cMinTime, cMinDistance, FListener);
1440 { TUIAndroidLocationSensor }
1442 constructor TUIAndroidLocationSensor.Create(AManager: TSensorManager);
LocationService: JO
1445 begin
inherited;
FActivity := TJNativeActivity.Wrap(PANativeActivity(System.DelphiActivity)^.clazz);
LocationService := FActivity.getSystemService(TJContext.JavaClass.LOCATION_SERVICE);
if Assigned(LocationService) then
FLocationManager := TJLocationManager.Wrap((LocationService as ILocalObject).GetObjectID);
1453 procedure TUIAndroidLocationSensor.DoLocationChangeT
1454 begin
inherited;
1458 procedure TUIAndroidLocationSensor.DoO
1459 begin
1463 function TUIAndroidLocationSensor.DoStart: B
function RunIfPossible(var ARunnable: TLocationR var AListener: TLocationL AProviderName: JString):
Provider: JLocationP
Result := F
if FLocationManager.isProviderEnabled(AProviderName) then
if AListener = nil then
AListener := TLocationListener.Create(Self);
Provider := FLocationManager.getProvider(AProviderName);
if Provider && nil then
ARunnable := TLocationRunnable.Create(FLocationManager, AListener, AProviderName);
FActivity.runOnUiThread(ARunnable);
Result := T
function RunTheBestProvider(var ARunnable: TLocationR var AListener: TLocationListener):B
Criteria: JC
ProviderName: JS
Result := F
Criteria := TJCriteria.JavaClass.
case Round(FAccuracy) of
Criteria.setHorizontalAccuracy(TJCriteria.JavaClass.ACCURACY_HIGH);
Criteria.setHorizontalAccuracy(TJCriteria.JavaClass.ACCURACY_MEDIUM);
Criteria.setHorizontalAccuracy(TJCriteria.JavaClass.ACCURACY_LOW);
ProviderName := FLocationManager.getBestProvider(Criteria, True);
if ProviderName && nil then
Result := RunIfPossible(ARunnable, AListener, ProviderName);
GPSStarted, NetworkStarted, PassiveStarted: B
1510 begin
Result := F
FPermitted := TPermission.IsPermitted(StringToJString('android.permission.ACCESS_FINE_LOCATION'));
if FPermitted then
if FAccuracy & 0 then
Result := RunTheBestProvider(FPassiveRunner, FPassiveListener)
GPSStarted := RunIfPossible(FGPSRunner, FGPSListener, TJLocationManager.JavaClass.GPS_PROVIDER);
NetworkStarted := RunIfPossible(FNetworkRunner, FNetworkListener, TJLocationManager.JavaClass.NETWORK_PROVIDER);
PassiveStarted := RunIfPossible(FPassiveRunner, FPassiveListener, TJLocationManager.JavaClass.PASSIVE_PROVIDER);
Result := GPSStarted or NetworkStarted or PassiveS
1527 procedure TUIAndroidLocationSensor.DoS
1528 begin
inherited;
if FPassiveListener && nil then
FLocationManager.removeUpdates(FPassiveListener);
if FNetworkListener && nil then
FLocationManager.removeUpdates(FNetworkListener);
if FGPSListener && nil then
FLocationManager.removeUpdates(FGPSListener);
1538 function TUIAndroidLocationSensor.GetAccuracy: TLocationA
1539 begin
Result := FA
1543 function TUIAndroidLocationSensor.GetAuthorized: TAuthorizationT
1544 begin
Result := TAuthorizationType.atNotS
1548 function TUIAndroidLocationSensor.GetAvailableProperties: TCustomLocationSensor.TP
1549 begin
Result := [TCustomLocationSensor.TProperty.Latitude,
TCustomLocationSensor.TProperty.Longitude, TCustomLocationSensor.TProperty.Altitude,
TCustomLocationSensor.TProperty.Speed, TCustomLocationSensor.TProperty.TrueHeading];
1556 function TUIAndroidLocationSensor.GetDistance: TLocationD
1557 begin
Result := FD
1561 function TUIAndroidLocationSensor.GetDoubleProperty(Prop: TCustomLocationSensor.TProperty): D
1562 begin
Result := NaN;
if Assigned(FLastValue) then
case Prop of
TCustomLocationSensor.TProperty.Latitude: Result := FLastValue.getL
TCustomLocationSensor.TProperty.Longitude: Result := FLastValue.getL
TCustomLocationSensor.TProperty.Altitude:
if FLastValue.hasAltitude then
Result := FLastValue.getA
TCustomLocationSensor.TProperty.Speed:
if FLastValue.hasSpeed then
Result := FLastValue.getS
TCustomLocationSensor.TProperty.TrueHeading:
if FLastValue.hasBearing then
Result := FLastValue.getB
Result := NaN;
1582 function TUIAndroidLocationSensor.GetLocationSensorType: TLocationSensorT
1583 begin
Result := TLocationSensorType.GPS;
1587 function TUIAndroidLocationSensor.GetPowerConsumption: TPowerC
1588 begin
Result := TPowerConsumption.pcNotS
1592 function TUIAndroidLocationSensor.GetSensorCategory: TSensorC
1593 begin
Result := TSensorCategory.L
1597 function TUIAndroidLocationSensor.GetState: TSensorS
1598 begin
if Supported then
Result := TSensorState.Ready
Result := TSensorState.NoD
1605 function TUIAndroidLocationSensor.GetStringProperty(Prop: TCustomLocationSensor.TProperty): string;
1606 begin
Result := '';
1610 function TUIAndroidLocationSensor.GetTimeStamp: TDateT
1611 begin
if Assigned(FLastValue) then
Result := FLastValue.getTime
Result := 0;
1618 procedure TUIAndroidLocationSensor.SetAccuracy(const Value: TLocationAccuracy);
1619 begin
inherited;
FAccuracy := Max(0, Value);
1624 procedure TUIAndroidLocationSensor.SetDistance(const Value: TLocationDistance);
1625 begin
inherited;
FDistance := V
1630 function TUIAndroidLocationSensor.Supported: B
1631 begin
Result := Assigned(FLocationManager);
1635 { TAndroidGeocoder }
1637 class function TAndroidGeocoder.Authorized: TAuthorizationT
1638 begin
Result := TAuthorizationType.atNotS
1642 class procedure TAndroidGeocoder.C
1643 begin
1647 class constructor TAndroidGeocoder.Create;
1648 begin
FActivity := TJNativeActivity.Wrap(PANativeActivity(System.DelphiActivity)^.clazz);
FGeocoder := TJGeocoder.JavaClass.init(FActivity);
1653 class destructor TAndroidGeocoder.Destroy;
1654 begin
1658 class procedure TAndroidGeocoder.GeocodeRequest(const AAddress: TCivicAddress);
LAddress: JA
1664 begin
List := FGeocoder.getFromLocationName(StringToJString(AAddress.ToString),10);
SetLength(FGeoFwdCoords, List.size);
for I := 0 to List.size - 1 do
JO := List.get(I);
LAddress := TJAddress.Wrap((JO as ILocalObject).GetObjectID);
FGeoFwdCoords[I] := TLocationCoord2D.Create(LAddress.getLatitude,LAddress.getLongitude);
DoGeocode(FGeoFwdCoords);
1676 class procedure TAndroidGeocoder.GeocodeReverseRequest(const Coords: TLocationCoord2D);
LAddress: JA
Addr: TCivicA
FLActivity: JA
1684 begin
FLActivity := TJNativeActivity.Wrap(PANativeActivity(System.DelphiActivity)^.clazz);
List := FGeocoder.getFromLocation(Coords.Latitude,Coords.Longitude,1);
if List.size = 0 then
Addr := nil
for I := 0 to List.size - 1 do
JO := List.get(I);
LAddress := TJAddress.Wrap((JO as ILocalObject).GetObjectID);
Addr := FGeoRevA
Addr.AdminArea
:= JStringToString(LAddress.getAdminArea);
Addr.CountryName
:= JStringToString(LAddress.getCountryName);
Addr.CountryCode
:= JStringToString(LAddress.getCountryCode);
Addr.Locality
:= JStringToString(LAddress.getLocality);
Addr.FeatureName
:= JStringToString(LAddress.getFeatureName);
Addr.PostalCode
:= JStringToString(LAddress.getPostalCode);
Addr.SubAdminArea
:= JStringToString(LAddress.getAdminArea);
Addr.SubLocality
:= JStringToString(LAddress.getSubLocality);
Addr.SubThoroughfare := JStringToString(LAddress.getSubThoroughfare);
Addr.Thoroughfare
:= JStringToString(LAddress.getThoroughfare);
DoGeocodeReverse(Addr);
1711 class function TAndroidGeocoder.GetGeocoderImplementer: TGeocoderC
1712 begin
Result := S
1716 class function TAndroidGeocoder.Supported: B
1717 begin
Result := F
if Assigned(FGeocoder) then
Result := TjGeocoder.JavaClass.isP
1723 { TAndroidGeocoder.TGeocoderRunnable }
1725 constructor TAndroidGeocoder.TGeocoderRunnable.Create(ACoord: TLocationCoord2D; AGeocoder: JGeocoder);
1726 begin
inherited Create;
FCoord := AC
FLGeocoder := AG
1732 procedure TAndroidGeocoder.TGeocoderRunnable.
Address: JA
Addr: TCivicA
Activity: JA
1740 begin
Activity := TJNativeActivity.Wrap(PANativeActivity(System.DelphiActivity)^.clazz);
FLGeocoder := TJGeocoder.JavaClass.init(Activity);
List := FLGeocoder.getFromLocation(FCoord.Latitude,FCoord.Longitude,10);
if List.size = 0 then
Addr := nil
for I := 0 to List.size - 1 do
JO := List.get(I);
Address := TJAddress.Wrap((JO as ILocalObject).GetObjectID);
Addr := FGeoRevA
Addr.AdminArea
:= JStringToString(Address.getAdminArea);
Addr.CountryName
:= JStringToString(Address.getCountryName);
Addr.CountryCode
:= JStringToString(Address.getCountryCode);
Addr.Locality
:= JStringToString(Address.getLocality);
Addr.FeatureName
:= JStringToString(Address.getFeatureName);
Addr.PostalCode
:= JStringToString(Address.getPostalCode);
Addr.SubAdminArea
:= JStringToString(Address.getAdminArea);
Addr.SubLocality
:= JStringToString(Address.getSubLocality);
Addr.SubThoroughfare := JStringToString(Address.getSubThoroughfare);
Addr.Thoroughfare
:= JStringToString(Address.getThoroughfare);
DoGeocodeReverse(Addr);
1768 initialization
随笔 - 348}

我要回帖

更多关于 smart sensor测温仪 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信