Skip to content

Delphi Android GPS Service

Verificar el estado del servicio de GPS en Android desde Delphi

Cada vez don mas las aplicaciones que utilizan los servicios de ubicación que brinda Android.

Particularmente, en las aplicaciones de seguimiento, el tener el servicio de ubicación (GPS) activo de forma permanente es escencial.

El componente en Delphi que nos permite tener la ubicación de tiempo real del dispositivo es TLocationSensor, encontrándose en la unidad System.Sensors.Components.

A continuación, un simple código de su uso:

procedure TForm1.Localizador;
var
  vLocationSensor: TLocationSensor;
  vLat: Extended;
  vLng: Extended;
begin
  try
    vLocationSensor := TLocationSensor.Create(Nil);
    vLocationSensor.Active := True;

    vLat := vLocationSensor.Sensor.Latitude;
    vLng := vLocationSensor.Sensor.Longitude;

    showmessage('Mi posición es: Lat=' + FloatToStr(vLat) + ' Lng=' + FloatToStr(vLat));

    vLocationSensor.Active := False;
  finally
    FreeAndNil(vLocationSensor);
  end;
end;

En este ejemplo lo que hacemos es crear el objeto, colocarlo como activo, y obtener las coordenadas (latitud y la longitud) del dispositivo.

Pero todo esto es posible si el servicio de GPS o ubicación del dispositivo móvil se encuentra activo.

El problema esta si el servicio está apagado o desactivado. Personalmente he tenido resultados desde Latitude=NAN y Longitude=NAN, hasta la última posición del dispositivo cuando el servicio estaba activo. O sea, una coordenada o posición antigua, dato que nos puede confundir y mucho.

Luego de arduas búsquedas y pruebas obtuve la solución.

Verificar estado del servicio de GPS en Android desde Delphi

En la teoría, la solución es muy fácil, antes de obtener las coordenadas, preguntar si el servicio de GPS o ubicación está activo.

Pero en la práctica no lo es, ya que en Delphi y menos en el TLocationSensor no poseen esta propiedad.

Así que tenemos que hacer uso de las librerías Java que posee Delphi par a tal fin.

Recordemos que el servicio de ubicación en un dispositivo móvil se basa en 2 sistemas, el primero con GPS propiamente dicho y el segundo con triangulación sobre Network.

Lo que nos duplica el problema, ya que puede estar ubicando al dispositivo con cualquiera de estos 2 sistemas.

A continuación les dejo la unidad que utilizo actualmente para comprobar si el servicio de ubicación en Android está activo:

unit ULocation;

interface

uses
  System.SysUtils,
  Androidapi.Helpers,
  Androidapi.JNI.JavaTypes,
  Androidapi.JNI.GraphicsContentViewText,
  Androidapi.JNI.Location,
  Androidapi.JNI.Provider,
  Androidapi.JNI.App;

function IsGPSProviderEnabled: Boolean;

function IsNetworkProviderEnabled: Boolean;

implementation

function IsProviderEnabled(const Provider: JString): Boolean;
var
  LocationManagerObj: JObject;
  LocationManager: JLocationManager;
begin
  LocationManagerObj := TAndroidHelper.Context.getSystemService(
    TJContext.JavaClass.LOCATION_SERVICE);
  LocationManager := TJLocationManager.Wrap(LocationManagerObj);
  Result := LocationManager.isProviderEnabled(Provider);
end;

function IsGPSProviderEnabled: Boolean;
begin
  Result := IsProviderEnabled(TJLocationManager.JavaClass.GPS_PROVIDER);
end;

function IsNetworkProviderEnabled: Boolean;
begin
  Result := IsProviderEnabled(TJLocationManager.JavaClass.NETWORK_PROVIDER);
end;

end.

La forma de utilizar el código anterior es:

Uses 
  ULocation;

...

procedure TForm1.Button1Click(Sender: TObject);;
begin
  if not IsGPSProviderEnabled and not IsNetworkProviderEnabled then
    Showmessage('GPS NO Acivo')
  else 
    Localizador;
end;

procedure TForm1.Localizador;
var
  vLocationSensor: TLocationSensor;
  vLat: Extended;
  vLng: Extended;
begin
  try
    vLocationSensor := TLocationSensor.Create(Nil);
    vLocationSensor.Active := True;

    vLat := vLocationSensor.Sensor.Latitude;
    vLng := vLocationSensor.Sensor.Longitude;

    showmessage('Mi posición es: Lat=' + FloatToStr(vLat) + ' Lng=' + FloatToStr(vLat));

    vLocationSensor.Active := False;
  finally
    FreeAndNil(vLocationSensor);
  end;
end;

También se puede detectar si la información del GPS es falsa, o sea que es aplicada por alguna Fake GPS App. Aprende con el siguiente artículo: Detectar Android Mock Location desde Delphi