Я пытаюсь создать проект, который использует компонент 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. Заранее спасибо.