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

时间:2016-08-25 17:41:25

标签: android gps google-play-services android-fusedlocation google-location-services

在我们的Android应用中,我们需要检测用户何时向我们提供假位置。一旦我们禁用假位置应用程序(“假GPS”),融合位置提供程序会不断向我们发送旧位置,但不会使用模拟位置键。

这是一个已知的错误吗?有没有办法检测这些新位置是否来自假提供者?

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

2 个答案:

答案 0 :(得分:0)

当您停止假GPS应用程序时,模拟位置将存储为GPS提供商。并且不要假设只要按下停止按钮就会收到真实位置。你可以在停止后做这样的事情。

  • 启用GPS(如果禁用)
  • 提出GPS定位请求(打开谷歌地图)
  • GPS图标将开始闪烁,只是等待(但不是在室内)
  

有没有办法检测这些新位置是否来自虚假提供商?

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

答案 1 :(得分:0)

自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都以固定的精度发送所有位置。但是当您禁用假GPS时,由于FusedLocation API的融合逻辑结果,未标记的位置可能会显示出来。

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

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

这种方法大部分时间都可以使用,但有时这个解决方案仍然会被愚弄。

代码是从此blog 复制的。