我已经做了一些调查,并在这里分享我的结果,这可能对其他人有用。
首先,我们可以检查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 (位置欺骗应用程序)
public static boolean areThereMockPermissionApps(Context context) { int count = 0; PackageManager pm = context.getPackageManager(); List 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; }
如果上述两种方法都是正确的,那么位置可能被欺骗或伪造的可能性很大。
现在,可以通过使用位置pipe理器的API来避免欺骗。
在请求提供者(networking和GPS)的位置更新之前,我们可以移除testing提供者,
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似乎是不可靠的,直到冰淇淋三明治。