频道分类

Delphi Android GPS服务

作者:admin 来源: 日期:2020/11/12 9:52:15 人气: 标签:

 
从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应用程序应用。通过以下文章学习:从Delphi检测Android Mock位置

上一篇:Delphi检测Android Mock位置下一篇:没有资料