本文整理自网络,侵删。
近年来,我们谈论GPS的部分移动设备变得非常重要。如果没有集成GPS,所有设备都无法出厂。从地理空间位置到捕获神奇宝贝,我们使用GPS可以获得的功能无数。该传感器的专家处理对于开发人员来说至关重要,但我们有一个很大的缺点。如果用户安装了简单的GPS仿真应用程序,则我们可以为GPS开发的所有功能都会受到影响。在上一篇文章中,我们学习了如何检测GPS服务是否处于活动状态,今天我们将学习如何在Delphi(Android Mock位置)上检测GPS信息是否为假。
模拟位置提供者android在Android中,我们有一个break版本,即Android 6之前和之后的版本。在此版本中,进行了许多更改,例如申请许可证的方式,其中GPS服务紧随其后。在版本6之前,要模拟位置,应用程序必须向用户询问称为ALLOW_MOCK_LOCATION的许可。function TForm1.isMockLocation(): Boolean;begin if TOSVersion.Check(6) then begin Result := False; begin else begin Result := not (JStringToString(TJSettings_Secure.JavaClass.getString(SharedActivityContext.getContentResolver, TJSettings_Secure.JavaClass.ALLOW_MOCK_LOCATION)) = '0'); end;end;要检测这些版本中的GPS信息是否为假,我们仅检查版本小于6的设备上安装的应用(如果有此许可)。因此,我们有很大的保证,用户可以模拟位置。从Android 6(棉花糖)版本开始,一切都发生了变化,用于模拟位置的应用程序不再需要此权限。更麻烦的是,他们不需要任何许可。通过此更改,他们设法让Android控制了Fake GPS Apps,而不是用户。为了验证Fake GPS Apps,在Java中实现了isFromMockProvider()函数,如果GPS信息为假,则返回True;如果GPS信息为真,则返回False,即,它来自GPS本身,而不是来自App如上所述,由Android完全管理。在Java中使用isFromMockProvider()函数的方式如下:
boolean isMock = false;if (android.os.Build.VERSION.SDK_INT >= 18) { isMock = location.isFromMockProvider();} else { isMock = !Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ALLOW_MOCK_LOCATION).equals("0");}但是在Delphi中,使用isFromMockProvider()函数的方法非常不同,因为我们必须利用在Delphi中实现的Java单元。
下面的函数(通过检查Android版本)完成了上一个示例,该函数用于检测GPS信息是否为假:
Uses Androidapi.JNI.Provider, Androidapi.JNI.Net, Androidapi.JNI.Location; function TForm1.isMockLocation(): Boolean;begin if TOSVersion.Check(6) then begin Result := LocationSimulation(); begin else begin Result := not (JStringToString(TJSettings_Secure.JavaClass.getString(SharedActivityContext.getContentResolver, TJSettings_Secure.JavaClass.ALLOW_MOCK_LOCATION)) = '0'); end;end; function TForm1.LocationSimulation(): Boolean;var LocationManagerObj: JObject; LocationManager: JLocationManager; Location: JLocation;begin try LocationManagerObj := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.LOCATION_SERVICE); LocationManager := TJLocationManager.Wrap(LocationManagerObj); Location := LocationManager.getLastKnownLocation(TJLocationManager.JavaClass.GPS_PROVIDER); if Location.isFromMockProvider then Result := True else Result := False; except Result := False; end;end;
相关阅读 >>
Delphi firemonkey移动应用程序将设置保存到ini文件的示例
Delphi system.sysutils.tmarshaller 与 system.tmarshal
Delphi 通过twebbrowser文档中的id查找html元素
更多相关阅读请进入《Delphi》频道 >>