【问题标题】:is there any way to read "select mock location app" from Android developer settings?有没有办法从 Android 开发者设置中读取“选择模拟位置应用程序”?
【发布时间】:2020-05-25 07:30:52
【问题描述】:

我知道在 Android 中了解某个位置是否是假点的推荐方法是这样的:

boolean isMock = false;
if (android.os.Build.VERSION.SDK_INT >= 18) {
    isMock = location.isFromMockProvider();
} else { // Old Android versions (<6)
    isMock = !Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ALLOW_MOCK_LOCATION).equals("0");
}

因此,对于当前的 Android,我必须请求位置权限才能知道这是否是模拟位置。但我认为如果我可以阅读“选择模拟位置应用程序”,则没有必要。

此外,如果您想显示警报消息,您可以自定义此消息。例如:您可以这样说:“请删除 com.lexa.fakegps 应用程序”。当用户点击“接受”时,您可以重定向到下一个链接:https://play.google.com/store/apps/details?id=com.lexa.fakegps

此外,还有假 gps 应用在 isFromMockProvider 方法中返回 false。

此外,您可以使用更适合您的用户使用的应用进行统计。

最后,我不明白为什么除了“选择模拟位置应用程序”之外,您可以阅读开发者设置的所有设置:

https://developer.android.com/reference/android/provider/Settings

有什么解决办法吗?或者只是这是一件愚蠢的不可能的事情?

【问题讨论】:

    标签: android geolocation mock-location


    【解决方案1】:

    我没有对此进行测试,但这看起来是合法的。我花了一个小时左右试图提出自己的解决方案,它就在 GitHub 上。

    https://github.com/GantMan/jail-monkey/blob/master/android/src/main/java/com/gantix/JailMonkey/MockLocation/MockLocationCheck.java

    【讨论】:

    • 您无法通过此方法确定当前位置是否是模拟的......它的基本作用是如果我的应用程序要求模拟位置权限,那么即使应用程序不是,它也会返回 true设置模拟位置 ...如果其他应用程序设置模拟位置,它将返回 false ...
    • 我在这个链接中看到了这个例子:it-swarm.dev/es/android/… 但是我的链接 ".equals("Android.permission.ACCESS_MOCK_LOCATION")" Android 而不是 android 中有一个拼写错误。在我的例子中,我不希望这完全是一个例子,三个应用程序具有 ACCESS_MOCK_LOCATION:com.gsmartstudio.fakegps(假 gps 应用程序)、com.lexa.fakegps(假 gps 应用程序)com.oem.oemlogkit(OnePlusLogKit)。但谢谢,这比什么都重要
    【解决方案2】:

    首先...通过使用以下代码

    boolean isMock = false;
    if (android.os.Build.VERSION.SDK_INT >= 18) {
        isMock = location.isFromMockProvider();
    } else { // Old Android versions (<6)
        isMock = !Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ALLOW_MOCK_LOCATION).equals("0");
    }
    

    您无法确保设备位置始终是伪造的。

    对于旧版本的安卓

    isMock = !Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ALLOW_MOCK_LOCATION).equals("0");
    

    正在使用,但它的作用基本上只是给出用户是否打开了允许模拟位置的设置......所以它只是作为一个过滤器来检查

    因此,如果我使用的是旧手机并打开此设置,即使我没有使用虚假位置,它仍会返回 true

    最新版本的安卓

    isMock = location.isFromMockProvider();
    

    这是错误的......可能并不总是返回正确的答案,即即使您使用模拟位置应用程序设置位置,有时它也可能返回错误。

    结论:

    结束阅读“选择模拟位置应用程序”设置并决定其价值只是一件愚蠢的事情。而且你不能编写始终没有错误的软件。

    我亲自尝试并测试了一些假 GPS 应用,例如
    Lexa Fake GPS Location
    Fake GPS

    对我来说,在我的测试中 isFromMockProvider() 总是返回正确的输出所以我发现发现错误的可能性很小。

    为了确保它是一个错误的值,我在这篇文章中找到了这个补救措施:Location on Android: Stop Mocking Me!我引用了这篇文章的补救措施

    由于大多数位置读数都已正确标记,因此不太可能 难以识别和拒绝假阴性。我选择了 以下策略:

    • 记住最近标记为模拟的位置

    • 如果新的“非模拟”读数在上一次模拟的 1 公里范围内,则拒绝它。

    • 仅在连续 20 次“非模拟”后清除最后一个模拟位置 读数。

    我也建议你通过FauChristian Answer for Detect or prevent if the user uses fake location

    谢谢...

    【讨论】:

    • 很抱歉,您的回答不是答案。我知道你所说的一切......因此,我的问题始于:“我知道在 Android 中推荐的了解方式......”但为什么我不知道开发人员配置的价值?我了解确定假 gps 的建议是 isFromMockProvider 方法。但是,如果我想进行统计,或预计请求位置?这是一件愚蠢的事情吗? o_O 想象一个有 10 个步骤的流程,在最后一步应用程序需要定位。然后应用程序说你:“你的位置是假的bla bla”。我认为如果应用程序在第一步中说明了什么,我们会获得更多的可用性
    • @Goin 正如我所说的,基本上只要知道变量值,您就无法确定该位置是否是模拟的,可能是因为它可能会被删除......而且还有其他方法从您的用户那里收集统计信息……我们应该考虑那些牢记用户隐私的人……如果有人想要我的位置,我必须知道他们想知道我的位置,这就是开发人员必须请求运行时许可的原因。我不希望任何应用程序通常会在不询问我的情况下关注我的位置。就算是好事
    • 1.是的,您说“知道该变量值,您无法确定该位置是否是模拟的”,但这不是我的问题。 2. 为什么我开启了“USB调试”,却无法读取“选择模拟位置应用程序”?为什么我能读懂每一个安卓开发者设置,却看不到“选择模拟位置应用”?
    • @Goin 我认为我们应该向 android 团队提出这个问题。在我看来,以编程方式了解它是没有意义的......如果我发现任何关于相同的事情,我会更新你
    • 谢谢,请保持头脑清醒。即使这是一个错误......我应该能够读取这个配置。
    猜你喜欢
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多