Delphi获取Android下GPS的NMEA 0183数据

下面的程序,可以实现Android下获取GNSS的NMEA0183数据:

unit utAndroidNmea;

interface

uses Androidapi.JNIBridge, Androidapi.JNI.App, Androidapi.NativeActivity, Androidapi.JNI.JavaTypes, Androidapi.JNI.Location;

type
  TonNmeaReceived=procedure(timestamp: Int64; nmea: String) of Object;

  TJGpsStatus_NmeaListener = class(TJavaGenericImport<JGpsStatus_NmeaListenerClass, JGpsStatus_NmeaListener>) end;

  TNmeaProvider=class(TJavaLocal,JGpsStatus_NmeaListenerClass, JGpsStatus_NmeaListener)
  protected
    FLocationManager:JLocationManager;
    FOnNmeaReceived:TonNmeaReceived;
  public
    procedure onNmeaReceived(timestamp: Int64; nmea: JString); cdecl;
  public
    constructor Create;
    destructor Destroy;override;
    function Run:Boolean;
    property OnNmeaLineReceived:TOnNmeaReceived read FOnNmeaReceived write FOnNmeaReceived;
  end;



implementation

uses Androidapi.Helpers, Androidapi.JNI.GraphicsContentViewText,  FMX.Helpers.Android,
FMX.Platform.Android, System.SysUtils, System.Android.Sensors;

{ TNmea }

constructor TNmeaProvider.Create;
begin
  inherited Create;
end;

destructor TNmeaProvider.Destroy;
begin
  if Assigned(FLocationManager) then FLocationManager.removeNmeaListener(Self );
  inherited;
end;

procedure TNmeaProvider.onNmeaReceived(timestamp: Int64; nmea: JString); cdecl;
begin
  if Assigned(FOnNmeaReceived) then FOnNmeaReceived(timestamp, JStringToString(nmea));
end;


function TNmeaProvider.Run:Boolean;
begin
  CallInUiThread(procedure
  var
    LocationService: JObject;
  begin
    LocationService := SharedActivityContext.getSystemService(TJContext.JavaClass.LOCATION_SERVICE);
    FLocationManager := TJLocationManager.Wrap((LocationService as ILocalObject).GetObjectID);
    FLocationManager.addNmeaListener(Self);
  end);

end;

end.

 

用法:

在Form中添加一个TLocationSensor, 设置Active:=True;

然后定义OnNmeaReceive方法:

procedure TForm1.OnNmeaReceived(timestamp: int64; nmeasentence: String);
begin
  FStream.Write(PChar(nmeasentence)^, Length(nmeasentence)*sizeof(Char));

end;

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。