使用模拟位置而不在设置中设置它

时间:2013-07-01 20:11:49

标签: java android gps mocking location

我正在编写一个使用android中的位置模拟可能性的应用程序。

我想要实现的是模拟我的位置而不在开发者选项中设置“允许模拟位置”标记。

我知道这是可能的,因为可以使用这个应用程序: https://play.google.com/store/apps/details?id=com.lexa.fakegps&hl=en

我尝试了什么:

生成apk,将其移至/ system / app,重新启动 我还在清单中使用和不使用ACCESS_MOCK_LOCATION权限时尝试了它。

但这一切都导致了这个例外:
RuntimeException:无法启动Activity:SecurityException:需要ACCESS_MOCK_LOCATION安全设置

3 个答案:

答案 0 :(得分:14)

我已经反编译了你提到的com.lexa.fakegps,以及它的作用:

private int setMockLocationSettings() {
    int value = 1;
    try {
        value = Settings.Secure.getInt(getContentResolver(),
                Settings.Secure.ALLOW_MOCK_LOCATION);
        Settings.Secure.putInt(getContentResolver(),
                Settings.Secure.ALLOW_MOCK_LOCATION, 1);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return value;
}

private void restoreMockLocationSettings(int restore_value) {
    try {
        Settings.Secure.putInt(getContentResolver(),
                Settings.Secure.ALLOW_MOCK_LOCATION, restore_value);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

/* every time you mock location, you should use these code */
int value = setMockLocationSettings();//toggle ALLOW_MOCK_LOCATION on
try {
    mLocationManager.setTestProviderLocation(LocationManager.GPS_PROVIDER, fake_location);
} catch (SecurityException e) {
    e.printStackTrace();
} finally {
    restoreMockLocationSettings(value);//toggle ALLOW_MOCK_LOCATION off
}

由于这些代码的执行时间很短,其他应用程序很难检测到ALLOW_MOCK_LOCATION的变化。

你也需要,
1.要求root用户访问你的设备
2.将您的应用移至/system/app/system/priv-app

我在我的项目中尝试了它并且工作正常。

答案 1 :(得分:2)

您需要对设备进行root访问才能执行此操作。

答案 2 :(得分:2)

试试这个http://repo.xposed.info/module/com.brandonnalls.mockmocklocations

  

如果"允许模拟位置"某些应用程序不会让您使用它们。转过来了   即使你没有嘲笑你的位置。这有助于防止应用   从检测到"允许模拟位置"已开启。