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