• 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;
  • 相关阅读:
    斯坦福大学Andrew Ng
    斯坦福大学Andrew Ng
    斯坦福大学Andrew Ng
    斯坦福大学Andrew Ng
    学到即赚到
    matlab学习笔记之五种常见的图形绘制功能
    Flutter混合栈的管理
    Android调用系统拍照裁剪和选图功能
    Android DataBinding库(MVVM设计模式)
    Flutter 动画使用
  • 原文地址:https://www.cnblogs.com/hezihang/p/4481451.html
Copyright © 2020-2023  润新知