繁体   English   中英

有没有办法从 Android 开发人员设置中读取“选择模拟位置应用程序”?

[英]is there any way to read “select mock location app” from Android developer settings?

我知道在 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,我必须请求位置权限才能知道这是否是模拟位置。 但是我认为如果我可以阅读“选择模拟位置应用程序”,则没有必要。

一大堆 Android 开发者选项 huk

此外,如果您想显示警报消息,您可以自定义此消息。 例如:您可以这样说:“请删除 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

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

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

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

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

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

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

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

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

android最新版本

isMock = location.isFromMockProvider();

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

结论:

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

我亲自尝试并测试了一些假的 GPS 应用程序,例如
Lexa 假 GPS 位置
假GPS

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

为了确保这是一个错误的值,我在这篇文章中找到了这个补救措施: Android 上的位置:停止 Mocking 我! 我引用这篇文章的补救措施

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

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

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

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

我还建议您通过FauChristian Answer 检测或防止用户使用虚假位置的 go

谢谢...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM