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