在我们的 Android 应用上,我们需要检测用户何时向我们提供虚假位置。一旦我们禁用了虚假位置应用程序(“Fake GPS”),Fused Location Provider 就会继续向我们发送旧位置,但上面没有模拟位置密钥。
这是一个已知的错误?有什么方法可以检测这些新位置是否来自虚假提供商?
我们正在使用带有 6.0.1 的 Nexus 6P 进行测试
在我们的 Android 应用上,我们需要检测用户何时向我们提供虚假位置。一旦我们禁用了虚假位置应用程序(“Fake GPS”),Fused Location Provider 就会继续向我们发送旧位置,但上面没有模拟位置密钥。
这是一个已知的错误?有什么方法可以检测这些新位置是否来自虚假提供商?
我们正在使用带有 6.0.1 的 Nexus 6P 进行测试
自 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 的融合逻辑的结果,可能会显示未标记的位置。
那么你可以做些什么来检测这些位置
这种方法在大多数情况下都有效,但有时这种解决方案仍然会被愚弄。
代码是从这个博客复制的。
当您停止 Fake GPS 应用程序时,将为 GPS 提供商存储模拟位置。并且不要假设无论何时按下停止按钮都会收到真实位置。你可以在停止后做这样的事情。
有什么方法可以检测这些新位置是否来自虚假提供商?
对于无根设备,可以了解某个位置是否是模拟的。看这个链接