禁用后虚假 GPS 位置仍然存在

Posted

技术标签:

【中文标题】禁用后虚假 GPS 位置仍然存在【英文标题】:Fake GPS locations persist after disabling 【发布时间】:2017-01-02 06:12:43 【问题描述】:

在我们的 android 应用中,我们需要检测用户何时向我们提供虚假位置。一旦我们禁用了虚假定位应用程序(“Fake GPS”),Fused Location Provider 就会继续向我们发送旧位置,但上面没有模拟位置键。

这是一个已知的错误吗?有什么方法可以检测这些新位置是否来自虚假提供商?

我们正在使用带有 6.0.1 的 Nexus 6P 进行测试

【问题讨论】:

【参考方案1】:

当您停止 Fake GPS 应用时,系统会为 GPS 提供商存储模拟位置。并且不要假设无论何时按下停止按钮都会收到真实位置。你可以在停止后做这样的事情。

启用 GPS(如果禁用) 为 GPS 提出位置请求(打开谷歌地图) GPS 图标将开始闪烁,请稍候(但不在室内)

有什么方法可以检测这些新位置是否来自虚假提供商?

对于非根设备,可以了解某个位置是否是模拟的。看这个link

【讨论】:

【参考方案2】:

自 API 18 发布以来,Location 对象具有 isFromMockProvider 方法来检查位置是否来自 MockProvider。

public static boolean isMockLocation(Location location) 
     return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2 && location != null && location.isFromMockProvider();

在 API 17 及更低版本中,使用 Settings.Secure 检测模拟位置。

public static Boolean isMockLocationEnabled(Context context) 
     return !Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ALLOW_MOCK_LOCATION).equals("0");

模拟位置的一般模式是方位、速度、精度、高度和时间间隔(连续数据点之间)是硬编码值。但有时isFromMockProvider 对于某些位置不可靠意味着它们没有被标记为模拟位置。但是这些位置的准确性比其他模拟位置读数要差得多。大多数假 GPS 以固定的精度发送所有位置。但是当您禁用 Fake GPS 时,由于 FusedLocation API 的融合逻辑的结果,可能会显示未标记的位置。

那么你可以做些什么来检测这些位置

保留最近检测到的模拟位置。 计算上一个模拟位置和当前未标记位置之间的距离。 如果计算的距离小于 1 KM,则拒绝它。 如果您收到至少 10 个好的位置,请删除最后存储的模拟位置。

这种方法大部分时间都行得通,但有时这种解决方案仍然会被愚弄。

代码从此blog 复制。

【讨论】:

以上是关于禁用后虚假 GPS 位置仍然存在的主要内容,如果未能解决你的问题,请参考以下文章

检索到 Android GPS 虚假位置

在 android 中获取更新位置和禁用 GPS 后如何获取?

打开 GPS 后,LocationManager 仍然无法找到最后一个已知位置

如果 GPS 被禁用,位置将无法进入三星手机

为 Genymotion 模拟器提供虚假位置

防止欺骗位置