从Delphi检查Android上GPS服务的状态
使用Android提供的位置服务的越来越多的应用程序变得越来越流行。
特别是在跟踪应用中,永久激活位置服务(GPS)是必不可少的。
使我们能够实时定位设备的Delphi中的组件是TLocationSensor,位于System.Sensors.Components单元中。
这是其使用的简单代码:
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;
在此示例中,我们要做的是创建对象,将其置于活动状态,然后获取设备的坐标(经度和纬度)。
但是,如果移动设备的GPS或定位服务处于活动状态,则所有这一切都是可能的。
问题是服务是关闭还是禁用。就个人而言,我得到的结果是从Latitude = NAN和Longitude = NAN到服务激活时设备的最后一个位置。也就是说,旧的坐标或位置的数据可能会使我们感到困惑。
经过艰苦的搜索和测试,我找到了解决方案。
从Delphi检查Android GPS服务状态
从理论上讲,解决方案非常简单,在获取坐标之前,先询问GPS或定位服务是否处于活动状态。
但是实际上并不是这样,因为在Delphi中(而在TLocationSensor中则更少)它们不具有此属性。
因此,我们必须为此目的使用Delphi拥有的Java库。
回想一下,移动设备上的定位服务基于2个系统,第一个具有GPS本身,第二个具有基于网络的三角测量。
由于这可能是使用这两个系统中的任何一个来定位设备,因此重复了该问题。
这是我目前用来检查Android中的定位服务是否处于活动状态的单位:
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.
使用以上代码的方法是:
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;