【问题标题】:Use mock location without setting it in settings使用模拟位置而不在设置中设置它
【发布时间】:2013-07-01 20:11:49
【问题描述】:

我正在编写一个应用程序,它利用了 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 安全设置

【问题讨论】:

  • 我希望你不介意我问:FakeGPS 对你有什么作用?我安装了应用程序(从商店),将.apk(称为base.apk)移动到/system/app,重新启动后应用程序工作。但是,当“允许模拟位置”关闭时,我无法欺骗位置,如果我打开它,然后使用应用程序进行欺骗,然后关闭“允许模拟位置”,欺骗会自动结束。介意分享一下我做错了什么吗?
  • 我不再使用这个应用程序。但是您可能会发现 Playstore 中的描述很有用:play.google.com/store/apps/…

标签: java android gps mocking location


【解决方案1】:

我已经反编译了你提到的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

我在我的项目中尝试过,效果很好。

【讨论】:

  • 我之前没有在 Marshmallow 中尝试过这段代码,但它适用于 Lollipop.@Marlon
  • 是的,它似乎在棉花糖中不起作用,由于谷歌将系统模拟设置更新为应用选择器,我无法再让它工作了。我已经反编译了 com.incorporateapps.fakegps,因为用户说它可以在棉花糖中做到这一点。上面的代码看起来相同,但它对我不起作用,我不知道我错过了什么。你能看看吗? @PageNotFound
  • @PageNotFound:这对我不起作用。调用 setTestProviderLocation(LocationManager.GPS_PROVIDER。我正在运行 4.4.4。
  • @PageNotFound 只需将应用程序移动到系统/应用程序就足够了吗?不需要通过系统签名吗?
  • @Blackkara 可以,不用系统签名。
【解决方案2】:

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

【讨论】:

  • 我确实拥有该设备的 root 访问权限。否则我无法将 apk 移动到 /system/app
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2015-11-25
    • 2010-09-17
    • 1970-01-01
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多