Delphi Rio 10.3.3 Маркер MapView onDrag возвращает неправильные координаты - PullRequest
1 голос
/ 26 апреля 2020

Я пытаюсь создать проект, который использует компонент Mapview с перетаскиваемым Mapmarker. Проблема в том, что события onMarkerDrag и onMarkerDragEnd возвращают созданный Mapmarker MapCoordinate, а не перетаскиваемый (Маркер перемещается нормально на карте, а компонент Google Maps показывает карту без проблем - ключ API работает отлично). Вот код:

    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.Maps,
  FMX.Controls.Presentation, FMX.StdCtrls, System.Sensors,
  System.Sensors.Components, FMX.ScrollBox, FMX.Memo;

type
  TForm1 = class(TForm)
    MapView1: TMapView;
    LocationSensor1: TLocationSensor;
    Memo1: TMemo;
    procedure FormShow(Sender: TObject);
    procedure MapView1MarkerDrag(Marker: TMapMarker);
    procedure MapView1MarkerDragEnd(Marker: TMapMarker);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
uses Androidapi.JNI.Os,
  Androidapi.JNI.JavaTypes,
  Androidapi.Helpers,
  System.Permissions, FMX.DialogService;
{$R *.fmx}

procedure TForm1.FormShow(Sender: TObject);
var
  MapDescr: TMapMarkerDescriptor;
  marker: TMapMarker;
  coord: TMapCoordinate;
begin
  coord := TMapCoordinate.Create(42,17);
  MapDescr := TMapMarkerDescriptor.Create(coord, 'Test');
  MapDescr.Draggable := True;
  MapView1.AddMarker(MapDescr);

    {$IF defined(Android)}
      PermissionsService.RequestPermissions
        ([JStringToString(TJManifest_permission.JavaClass.ACCESS_FINE_LOCATION)],
        procedure(const APermissions: TArray<string>;
          const AGrantResults: TArray<TPermissionStatus>)
        begin
          if (Length(AGrantResults) = 1) and
            (AGrantResults[0] = TPermissionStatus.Granted) then
            { activate or deactivate the location sensor }
            begin
              LocationSensor1.Active := True;
            end
          else
            begin
              LocationSensor1.Active := false;
              TDialogService.ShowMessage('Location permission not granted');
            end;
        end);
      sleep(100);
      {$ENDIF}
      sleep(200);
      {$IF defined(Android)}
      PermissionsService.RequestPermissions
        ([JStringToString(TJManifest_permission.JavaClass.ACCESS_LOCATION_EXTRA_COMMANDS)],
        procedure(const APermissions: TArray<string>;
          const AGrantResults: TArray<TPermissionStatus>)
        begin
          if (Length(AGrantResults) = 1) and
            (AGrantResults[0] = TPermissionStatus.Granted) then
            { activate or deactivate the location sensor }
            begin
              LocationSensor1.Active := True;
            end
          else
            begin
              LocationSensor1.Active := false;
              TDialogService.ShowMessage('Location permission not granted');
            end;
        end);
      sleep(100);
      {$ENDIF}


end;

procedure TForm1.MapView1MarkerDrag(Marker: TMapMarker);
begin
  Memo1.BeginUpdate;
  Memo1.Lines.Add('Dragging:'+FloatToStr(Marker.Descriptor.Position.Latitude)+'-'+FloatToStr(Marker.Descriptor.Position.Longitude));
  Memo1.EndUpdate;
end;

procedure TForm1.MapView1MarkerDragEnd(Marker: TMapMarker);
begin
  Memo1.BeginUpdate;
  Memo1.Lines.Add('End:'+FloatToStr(Marker.Descriptor.Position.Latitude)+'-'+FloatToStr(Marker.Descriptor.Position.Longitude));
  Memo1.EndUpdate;
end;

end.

После выполнения кода на мобильном устройстве Android обе процедуры обработки события возвращают: 42,17. Я построил приложение, используя SDK 25.2.5 32bit и 26.1.1 32bit с тем же результатом, я также попытался добавить в манифест xml файл следующее:

<uses-library
  android:name="org.apache.http.legacy"
  android:required="false" />

, но безуспешно. В библиотеках целевых платформ я использую по умолчанию: com-google- android -gms.play-services-maps.16.1.0.dex.jar. Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...