Delphi 检查 Android 上 GPS 服务的状态  
官方Delphi 学习QQ群: 682628230(三千人)
频道

Delphi 检查 Android 上 GPS 服务的状态


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