寻找在 Android 上防止/检测 GPS 欺骗的最佳方法。关于如何完成的任何建议,以及可以做些什么来阻止它?我猜用户必须打开模拟位置来欺骗 GPS,如果这样做了,那么他们可以欺骗 GPS?
我想我只需要检测是否启用了模拟位置?还有其他建议吗?
最佳答案
我做了一些调查并在这里分享我的结果,这可能对其他人有用。
首先,我们可以检查 MockSetting 选项是否打开
public static boolean isMockSettingsON(Context context) {
// returns true if mock location enabled, false if not enabled.
if (Settings.Secure.getString(context.getContentResolver(),
Settings.Secure.ALLOW_MOCK_LOCATION).equals("0"))
return false;
else
return true;
}
其次,我们可以检查设备中是否有其他应用在使用android.permission.ACCESS_MOCK_LOCATION
(Location Spoofing Apps)
public static boolean areThereMockPermissionApps(Context context) {
int count = 0;
PackageManager pm = context.getPackageManager();
List<ApplicationInfo> packages =
pm.getInstalledApplications(PackageManager.GET_META_DATA);
for (ApplicationInfo applicationInfo : packages) {
try {
PackageInfo packageInfo = pm.getPackageInfo(applicationInfo.packageName,
PackageManager.GET_PERMISSIONS);
// Get Permissions
String[] requestedPermissions = packageInfo.requestedPermissions;
if (requestedPermissions != null) {
for (int i = 0; i < requestedPermissions.length; i++) {
if (requestedPermissions[i]
.equals("android.permission.ACCESS_MOCK_LOCATION")
&& !applicationInfo.packageName.equals(context.getPackageName())) {
count++;
}
}
}
} catch (NameNotFoundException e) {
Log.e("Got exception " , e.getMessage());
}
}
if (count > 0)
return true;
return false;
}
如果上述两种方法,第一种和第二种方法都是正确的,那么位置很可能是欺骗或伪造的。
现在,可以通过使用 Location Manager 的 API 来避免欺骗。
我们可以在向两个提供商(网络和 GPS)请求位置更新之前删除测试提供商
LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE);
try {
Log.d(TAG ,"Removing Test providers")
lm.removeTestProvider(LocationManager.GPS_PROVIDER);
} catch (IllegalArgumentException error) {
Log.d(TAG,"Got exception in removing test provider");
}
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, locationListener);
我已经看到 removeTestProvider(~) 在 Jelly Bean 和更高版本上运行得非常好。这个 API 在 Ice Cream Sandwich 之前似乎是不可靠的。
Flutter 更新:
使用Geolocator并检查 Position
对象的 isMocked
属性。
关于android - 禁用/检查模拟位置(防止 gps 欺骗),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6880232/