android - 禁用/检查模拟位置(防止 gps 欺骗)

标签 android gps spoof

寻找在 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/

相关文章:

java - addView equivalente 但将 Preference 添加到 PreferenceScreen?

android - 将 GPS 数据从 Android 发送到 Django 的最聪明的方法

android - 获取 GPS 位置 消耗电池

C#访问iPhone构建的网页

ip - 是否可以在 NAT 后面欺骗 IP?

asp.net - Request.UserHostAddress.ToString() 可以被欺骗吗? asp.net 4.0 - iis 7.5

android - 在 ViewPager 中更改 fragment 时,使用 Elevation 创建的阴影会闪烁

java - 是否可以添加库项目的 JAR 文件并在另一个项目中使用其资源?

android - 编辑 Canvas 部分

android - RequestLocationUpdates with Pendingintent 以及如何获取位置提供者(GPS,网络)状态?