如何检查Android棉花糖模拟位置?

如何检测是否在Android Marshmallow使用Mock Location触发Mock Location

以前,我使用了Settings.Secure.ALLOW_MOCK_LOCATION

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

我想检查触发是否与假的位置或原始的GPS?

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

如果您正在使用FusedLocationProviderApi并使用setMockLocation(mGoogleApiClient, fakeLocation);设置模拟位置setMockLocation(mGoogleApiClient, fakeLocation); 在callback/ pendingIntentCallback中,返回的Location对象包含KEY_MOCK_LOCATION extra,一个布尔值,指示接收到的对象是模拟的。

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

接受的答案是一个工作的解决scheme,但是,我想补充一点为了完整性。

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

我在不同的设备和操作系统版本上进行了广泛的模拟实验,得出如下结论:

  • KEY_MOCK_LOCATION额外负责与.isFromMockProvider()完全相同的信息,即.isFromMockProvider()将在额外存在时返回true ,否则返回false 。 换句话说,它没有提供附加价值,只是一个更复杂的方式来找出一个单独的位置是否被标签为提供者的模拟。 在这里看到更多的信息。
    所以我肯定会推荐使用.isFromMockProvider()

  • 额外的和吸气剂都可以零星地返回假阴性 ,即所讨论的位置是模拟的,但不是标记的。 这对于某些用例显然是非常糟糕的。 如果您想了解更多信息 ,我已经撰写了关于此主题的详细博客文章 。

在与Android位置(和模拟标签问题)挣扎了很长一段时间之后,我发布了LocationAssistant ,这个实用工具类将可靠地拒绝使用API​​ 15+的非根设备上的模拟位置。 它也从大部分的FusedLocationProvider样板中解除了你的负担。 也许你会发现它适用于你的下一个位置感知应用程序项目。

这个答案似乎不适合我。 extras.getBoolean(FusedLocationProviderApi.KEY_MOCK_LOCATION, false)总是返回false。

但是,我做到了这一点:

 @Override public void onLocationChanged (Location location){ boolean isMockLocation = location.isFromMockProvider(); } 

我开始得到正确的结果。

在棉花糖,你可以使用AppOpsManager检查mock_location。

类似的答案在这里: 如何阅读在Android M – API 23选定的模拟位置应用程序