我知道在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
有什么解决方法吗?还是仅仅是愚蠢的不可能的事情?
我还没有测试过,但这看起来合法。我花了一个小时左右的时间来想出自己的解决方案,它就在GitHub上。
首先,通过使用以下代码
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();
这是越野车……可能无法始终返回正确的答案,即,即使您使用模拟位置应用程序设置了位置,有时也可能返回false。
结论:
结束阅读“选择模拟位置应用”设置并对其值做出决定只是愚蠢的事情。而且您不能编写始终没有错误的软件。
我亲自尝试过并测试了一些伪造的GPS应用程序,例如Lexa Fake GPS LocationFake GPS
对于我来说,在我的测试中[[isFromMockProvider()总是向我返回正确的输出,所以我发现发现错误的可能性很小。
并且为了确保它是错误的值,我在这篇文章中找到了这种补救措施:Location on Android: Stop Mocking Me!我引用了本文的补救措施由于大多数位置读数均已正确标记,所以也不太正确难以识别和拒绝假阴性。我选择了以下策略:
仅在连续20个“非模拟”之后清除最后一个模拟位置读数。
谢谢...