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