如何在 Android Marshmallow 中检查模拟位置?

新手上路,请多包涵

如何检测位置是否被触发 Mock Location 在 Android Marshmallow

以前,我用过 Settings.Secure.ALLOW_MOCK_LOCATION

但是,在 API 级别 23 中,这已被弃用。

我想检查触发器是假位置还是原始 GPS?

现在,检查 Mock Location 是否启用的替代方法是什么 Android Marshmallow

原文由 Bharath 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 881
2 个回答

If you are using FusedLocationProviderApi and have set mock location using setMockLocation(mGoogleApiClient, fakeLocation); in the callback/pendingIntentCallback the returned Location object contains KEY_MOCK_LOCATION extra, a布尔值,表示接收到的对象是模拟的。

 @Override

public void onLocationChanged (Location location){
   Bundle extras = location.getExtras();
   boolean isMockLocation = extras != null && extras.getBoolean(FusedLocationProviderApi.KEY_MOCK_LOCATION, false);

}

原文由 Nikola Despotoski 发布,翻译遵循 CC BY-SA 3.0 许可协议

接受的答案是一个可行的解决方案,但是,为了完整起见,我想补充一些要点。

检测模拟位置的最佳内置方法(不仅自 Marshmallow 以来,而且自 API 18+ 以来)是使用 Location.isFromMockProvider() ,如其他答案和评论中所述。

我在不同设备和操作系统版本上对模拟位置进行了广泛试验,得出以下结论:

  • The KEY_MOCK_LOCATION extra bears the exact same information as .isFromMockProvider() , ie .isFromMockProvider() will return true when the extra is present and false 当它不是。换句话说,它不提供任何附加值,只是一种更复杂的方法,用于查明某个位置是否被其提供者标记为模拟位置。有关更多信息,请参见 此处

所以我肯定会推荐使用 .isFromMockProvider()

  • extra 和 getter 都可能偶尔返回 false negatives ,即有问题的位置是模拟的但没有这样标记。对于某些用例来说,这显然非常糟糕。如果你想了解更多,我已经写了一篇关于这个主题的详细 博客文章

在与 Android 位置(和模拟标签问题)斗争了很长一段时间后,我发布了 LocationAssistant ,这是一个实用程序类,可以可靠地拒绝具有 API 15+ 的非根设备上的模拟位置。它还可以减轻您大部分 FusedLocationProvider 样板的负担。也许您会发现它对您的下一个位置感知应用程序项目很有用。

原文由 KlaasNotFound 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题