本文整理自网络,侵删。
从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实现win10下Delphi 10.3.1 inline hook 调试器法获取寄存器并修改
Delphi 如何把程序钉到windows7任务栏(修正版)
Delphi 10.4中新增功能:新的vcl tedgebrowser组件
老外写的在桌面添加快捷方式(Delphi xe5 android)
更多相关阅读请进入《Delphi》频道 >>