下面的程序,可以實現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;