6

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

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

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

我尝试了什么:

生成一个 apk,将其移动到 /system/app,重新启动
我还尝试了在清单中使用和不使用 ACCESS_MOCK_LOCATION 权限的情况。

但这一切都导致了这个异常:
RuntimeException: Unable to start Activity: SecurityException: Requires ACCESS_MOCK_LOCATION 安全设置

4

3 回答 3

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

我在我的项目中尝试过它,它工作正常。

于 2014-09-15T13:46:27.707 回答
2

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

于 2014-03-12T21:01:08.217 回答
2

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

如果打开“允许模拟位置”,某些应用程序将不允许您使用它们,即使您没有模拟您的位置。这有助于防止应用检测到“允许模拟位置”已打开。

于 2015-06-02T11:30:52.370 回答