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

Как узнать GPS координаты устройства при отсутствии GPS датчика?


zairkz

Вопрос

Всем здоровья, вообщем ситуация следующая имеется телефон без GPS датчика, но нужны координаты. 

 

Подскажите как можно их вытащить

Например при отображении MapView на ней кнопочка MyLocation которая даже без датчика достаточно точно показывает местоположения. 

 

Вообщем как вытащить эти координаты UserLocation не отображая карту (может в системных данных где то)?

Или как программно нажать MyLocation, чтобы после центрирования карты получить координаты MapView.Position?

 

Реверс Геокодинг по вайфай или мобильным данным (ip-адрес) совсем не то. 

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

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

  • 0

Решено Zuby и Cody71727172   :), может кому пригодиться:

 

Вообщем кнопочка MyLocation на MapView цепляет данные c LOCATION_SERVICE (Androidapi.JNI.Location) 

и если отсутствует GPS датчик в телефоне, тогда:

 

Прописываем функцию:

function CheckGPSActive: Boolean;
// uses Androidapi.JNIBridge, Androidapi.JNI.Location,  Androidapi.JNI.JavaTypes, Androidapi.JNI.GraphicsContentViewText, Androidapi.Helpers
{$IFDEF ANDROID}
var
  LocManagerObj: JObject;
  LocationManager: JLocationManager;
  allProviders: JList;
  I: Integer;
begin
  Result := false;
  LocManagerObj := SharedActivityContext.getSystemService (TJContext.JavaClass.LOCATION_SERVICE); // запрашиваем сервис Location
  if Assigned(LocManagerObj) then
  begin
    LocationManager := TJLocationManager.Wrap((LocManagerObj as ILocalObject).GetObjectID);     // получаем LocationManager


    if Assigned(LocationManager) then
    begin
      allProviders := LocationManager.getProviders(true);  // запрашиваем список всех провайдеров
      if Assigned(allProviders) then
        with TStringList.Create do
        begin
          for I := 0 to allProviders.size - 1 do Add(JStringToString(allProviders.get(I).ToString));
          if ((IndexOf('gps') >= 0) or (IndexOf('network') >= 0) or (IndexOf('passive') >= 0)) then
                     Result := true;
          Free;
        end;
    end;
 end;


{$ELSE}
begin
  Result := false;
{$ENDIF}
end;

и при запуске LocationSensor например на Form.Create проверяем

procedure TForm_main.FormCreate(Sender: TObject);
begin
{$IFDEF ANDROID}
 LocationSensor.Active:=true;
 if not LocationSensor.Active then
        if not CheckGPSActive then
          ShowMessage('Включите GPS для определения Вашего местоположения!')
        else
          LocationSensor.Active := true;
{$ENDIF}
end;

LocationSensor сам подключит источник данных, поэтому изменять в LSensor1LocationChanged ничего не нужно, например:

procedure TForm_Main.LSensor1LocationChanged(Sender: TObject; const [Ref] OldLocation, NewLocation: TLocationCoord2D);
//uses Maps.Engine
var 
 MapsEngine: TMapsEngine;
 MapsLoc: TMapCoordinate;
 MapsData: TMapsEngineGeoData;
begin
  MapsLoc := TMapCoordinate.Create(NewLocation.Latitude, NewLocation.Longitude);
  MapsEngine.SetOptionsYandex('');
  MapsEngine.Geocoding(NewLocation, MapsData);
  Edit1.text:= MapsData.FormattedAddress;
end;

 

Изменено пользователем Brovin Yaroslav
Ссылка на комментарий
Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...