Перейти к содержанию
Fire Monkey от А до Я
  • 0

Число GPS спутников


mestok

Вопрос

Добрый день!

Не подскажите, кто если сталкивался?...

Пытаюсь получить число спутников на Android`е. Прога "падает". Под Win (если uses System.Android.Sensors заменить на System.Win.Sensors) работает. Может есть у кого решение?

Код модудя:

uses

System.Android.Sensors, System.Sensors;

type

TMyPlatformGpsStatus = class(TPlatformGpsStatus)
public
class function GetGpsStatusImplementer: TGpsStatusClass; override;
end;
{ TMyPlatformGpsStatus }

class function TMyPlatformGpsStatus.GetGpsStatusImplementer: TGpsStatusClass;
begin
Result := inherited;
end;

 

По клику баттона:

Label2.Text:=IntToStr(TMyPlatformGpsStatus.GetGpsStatusImplementer.SatelliteCount);

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
В 02.05.2024 в 12:57, OnePeople сказал:

Супер!!! Спасибо! А можно пример в проекте? - не пойму как "прикрутить" вызов...

Изменено пользователем mestok
Ссылка на комментарий
  • 0

JGnssStatus в модуле Androidapi.JNI.GnssStatusCallback.pas был не определен... - я добавил. Но правильно, или нет - вопрос.

При попытке выполнить нижеуказанный код вылетает исключение "interface not supported". Что я делаю не так?

Код формы:

unit Unit1;
interface
uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
  FMX.Controls.Presentation,Androidapi.JNI.GnssStatusCallback, System.Android.Sensors, System.Sensors,Androidapi.JNI.Location,
  FMX.Memo.Types, FMX.ScrollBox, FMX.Memo, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNIBridge, Androidapi.JNI.App,
  Androidapi.Helpers, Androidapi.JNI.JavaTypes, System.Sensors.Components;
type
  TForm7 = class(TForm)
    CornerButton1: TCornerButton;
    Memo1: TMemo;
×
unit Unit1;
    LocationSensor1: TLocationSensor;
    procedure CornerButton1Click(Sender: TObject);
  private
  public
  end;
var
  Form7: TForm7;
implementation
{$R *.fmx}
type
  TMyGnssStatusCallbackDelegate = class(TJGnssStatusCallbackDelegate)
  public
    procedure onFirstFix(ttffMillis: Integer); cdecl;
    procedure onSatelliteStatusChanged(status: JGnssStatus); cdecl;
    procedure onStarted; cdecl;
    procedure onStopped; cdecl;
  end;
procedure TMyGnssStatusCallbackDelegate.onFirstFix(ttffMillis: Integer);
begin
  //...
end;
procedure TMyGnssStatusCallbackDelegate.onSatelliteStatusChanged(status: JGnssStatus);
begin
  // Событие изменения статуса спутников
end;
procedure TMyGnssStatusCallbackDelegate.onStarted;
begin
  // Событие запуска отслеживания GNSS
end;
procedure TMyGnssStatusCallbackDelegate.onStopped;
begin
  // Событие остановки отслеживания GNSS
end;
procedure TForm7.CornerButton1Click(Sender: TObject);
var
  LocationManager: JLocationManager;
  LocationProviders: JList;
  GnssStatusCallbackClass: JGnssStatusCallbackClass;
  GnssStatusCallback: JGnssStatusCallback;
  i: Integer;
begin
  try
    LocationManager := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.LOCATION_SERVICE) as JLocationManager;
    LocationProviders := LocationManager.getProviders(True);
    for i := 0 to LocationProviders.size - 1 do
    begin
      if (LocationProviders.get(i) as JString).equals(TJLocationManager.JavaClass.GPS_PROVIDER) then
      begin
        GnssStatusCallbackClass := TJavaGenericImport<JGnssStatusCallbackClass, JGnssStatusCallback>.JavaClass;
        GnssStatusCallback := GnssStatusCallbackClass.init(TAndroidHelper.Context, TMyGnssStatusCallbackDelegate.Create);
        Exit;
      end;
    end;
  except
    on E: Exception do
    begin
      Memo1.Lines.Add('Error checking GNSS status: ' + E.Message);
    end;
  end;
end;
end.

 

Androidapi.JNI.GnssStatusCallback.zip

Ссылка на комментарий
  • 0
 uses
...
type
    TGnnsStatusCallbackDelegate = class(TJavaLocal, JGnssStatusCallbackDelegate)
  private
    FCallback: JGnssStatusCallback;
  protected
  public
    procedure onFirstFix(ttffMillis: Integer); cdecl;
    procedure onSatelliteStatusChanged(status: JGnssStatus); cdecl;
    procedure onStarted; cdecl;
    procedure onStopped; cdecl;
  public
    constructor Create();
  end;
...
var
GnnsStatusCallbackDelegate := TGnnsStatusCallbackDelegate

implementation

procedure TForm1.FormCreate(Sender: TObject);

begin
GnnsStatusCallbackDelegate := TGnnsStatusCallbackDelegate.Create;
end;


constructor TGnnsStatusCallbackDelegate.Create;
begin
  inherited Create;
  FCallback := TJGnssStatusCallback.JavaClass.init(TAndroidHelper.Context, Self);
end;

procedure TGnnsStatusCallbackDelegate.onFirstFix(ttffMillis: Integer);
begin
 //
end;

procedure TGnnsStatusCallbackDelegate.onSatelliteStatusChanged(
  status: JGnssStatus);
  var
  satelliteCount, usedCount: Integer;
begin
 TTask.Run(procedure
 var
 i: Integer;
   begin
     try
      
       usedCount:= 0;
       satelliteCount := status.getSatelliteCount();
       for i := 0 to satelliteCount - 1 do
          if status.usedInFix(i) then
             usedCount := usedCount + 1;
       TThread.Synchronize(nil, procedure
         begin
           Form1.tqsSatMax.Text := satelliteCount.ToString;
           Form1.tqsSat.Text := usedCount.ToString;
           Form1.tnSat.Text := usedCount.ToString;
         end);
      except
       Form1.LogCAAdd('TGnnsStatusCallback except');
      end;
   end);
end;

procedure TGnnsStatusCallbackDelegate.onStarted;
begin
 //
end;

procedure TGnnsStatusCallbackDelegate.onStopped;
begin
 //

end;

 

Ссылка на комментарий
  • 0
6 часов назад, OnePeople сказал:
 uses
...
type
    TGnnsStatusCallbackDelegate = class(TJavaLocal, JGnssStatusCallbackDelegate)
  private
    FCallback: JGnssStatusCallback;
  protected
  public
    procedure onFirstFix(ttffMillis: Integer); cdecl;
    procedure onSatelliteStatusChanged(status: JGnssStatus); cdecl;
    procedure onStarted; cdecl;
    procedure onStopped; cdecl;
  public
    constructor Create();
  end;
...
var
GnnsStatusCallbackDelegate := TGnnsStatusCallbackDelegate

implementation

procedure TForm1.FormCreate(Sender: TObject);

begin
GnnsStatusCallbackDelegate := TGnnsStatusCallbackDelegate.Create;
end;


constructor TGnnsStatusCallbackDelegate.Create;
begin
  inherited Create;
  FCallback := TJGnssStatusCallback.JavaClass.init(TAndroidHelper.Context, Self);
end;

procedure TGnnsStatusCallbackDelegate.onFirstFix(ttffMillis: Integer);
begin
 //
end;

procedure TGnnsStatusCallbackDelegate.onSatelliteStatusChanged(
  status: JGnssStatus);
  var
  satelliteCount, usedCount: Integer;
begin
 TTask.Run(procedure
 var
 i: Integer;
   begin
     try
      
       usedCount:= 0;
       satelliteCount := status.getSatelliteCount();
       for i := 0 to satelliteCount - 1 do
          if status.usedInFix(i) then
             usedCount := usedCount + 1;
       TThread.Synchronize(nil, procedure
         begin
           Form1.tqsSatMax.Text := satelliteCount.ToString;
           Form1.tqsSat.Text := usedCount.ToString;
           Form1.tnSat.Text := usedCount.ToString;
         end);
      except
       Form1.LogCAAdd('TGnnsStatusCallback except');
      end;
   end);
end;

procedure TGnnsStatusCallbackDelegate.onStarted;
begin
 //
end;

procedure TGnnsStatusCallbackDelegate.onStopped;
begin
 //

end;

 

Спасибо! Работает!

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...