频道分类

Delphi检测Android Mock位置

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

 
近年来,我们谈论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 Android 拨打电话下一篇:没有资料