Delphi 检测 Android Mock 位置  
官方Delphi 学习QQ群: 682628230(三千人)
频道

Delphi 检测 Android Mock 位置


Delphi 检测 Android Mock 位置

近年来,我们移动设备的一部分变得非常重要,我们谈论 GPS。在某种程度上,没有集成 GPS 的设备都不会出厂。


我们可以通过 GPS 获得的功能数不胜数,从地理空间定位到捕捉神奇宝贝。


这种传感器的专家处理对于开发人员来说是必不可少的,但我们有一个很大的缺点。


如果用户安装一个简单的GPS 模拟应用程序,我们可以为 GPS 开发的所有功能都会受到影响。


在之前的文章中,我们学习了如何检测 GPS 服务是否处于活动状态,今天我们将学习如何从 Delphi(Android Mock Location)检测 Android 上的 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 (Marshmallow) 版本开始,一切都变了,模拟位置的应用程序不再需要此权限。更困难的是,他们不需要任何许可。


通过此更改,他们设法让 Android 控制假 GPS 应用程序,而不是用户。


为了验证Fake GPS Apps,在java中实现了isFromMockProvider()函数,如果GPS信息为假则返回True,如果GPS信息为真则返回False,即来自GPS本身而不是来自应用程序完全由 Android 管理,如上所述。


使用的方式isFromMockProvider()函数中的Java如下:


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 单元。


Delphi中检测GPS信息是否为假的函数如下,完成前面的例子,配合Android版本检查:


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;



推荐分享
图文皆来源于网络,内容仅做公益性分享,版权归原作者所有,如有侵权请告知删除!
 

Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号

执行时间: 0.038035154342651 seconds