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;
如果 GPS 信息是假的,也可以检测到,即由假 GPS App 应用。
Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号
执行时间: 0.047325134277344 seconds