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

3

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

hunk of Android developer options 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

有没有解决方案?还是这只是一个愚蠢的不可能的事情?

2个回答

2

你不能通过这种方法确保当前位置是否为模拟位置...它的基本作用是,如果我的应用程序正在请求模拟位置权限,则即使应用程序没有设置模拟位置,它也会返回true...如果其他应用程序设置了模拟位置,则它将返回false... - AgentP
我在这个链接中看到了这个例子:https://www.it-swarm.dev/es/android/deshabilitarverificar-la-ubicacion-simulada-evitar-la-simulacion-de-gps/940536196/ 但是我的链接中有一个错别字".equals("Android.permission.ACCESS_MOCK_LOCATION")",应该是android而不是Android。在我的情况下,有三个应用程序具有ACCESS_MOCK_LOCATION权限:com.gsmartstudio.fakegps(虚假GPS应用程序),com.lexa.fakegps(虚假GPS应用程序)和com.oem.oemlogkit(OnePlusLogKit)。但还是谢谢,总比没有好。 - Goin

1
首先...通过使用以下代码。
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。

适用于最新版本的安卓系统。

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
@Goin 正如我所说的,仅凭知道变量值,您无法确定位置是否为模拟位置,可能是因为它可能已被删除...而且还有其他方法可以从用户那里收集统计信息...我们应该考虑这些并牢记用户隐私...如果有人想要我的位置,我必须知道他们想知道我的位置,这就是为什么开发人员必须请求运行时权限。我不希望任何应用程序通常在未经询问的情况下监视我的位置。即使是出于好意。 - AgentP
  1. 是的,你说过“知道变量值后你无法确定位置是否为模拟位置”,但这不是我的问题。
  2. 为什么我可以读取例如启用了“USB调试”时却无法读取“选择模拟位置应用程序”?为什么我可以读取每个Android开发者设置,却无法读取“选择模拟位置应用程序”?
- Goin
1
@Goin 我认为我们应该向 Android 团队询问这个问题。在我看来,从程序角度来了解它毫无意义...如果我找到相关信息,我会及时更新您。 - AgentP
谢谢,保持开放的心态。即使出现错误...我应该能够读取此配置。 - Goin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接