繁体   English   中英

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

[英]How to check for Mock Location in Android Marshmallow?

如何检测位置是否由 Android Marshmallow中的Mock Location触发?

以前,我使用Settings.Secure.ALLOW_MOCK_LOCATION

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

我想检查触发器是使用假定位还是原始 GPS?

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

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

@Override

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

}

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

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

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

  • KEY_MOCK_LOCATION extra 具有与.isFromMockProvider()完全相同的信息,即.isFromMockProvider()将在 extra 存在时返回true ,而在不存在时返回false 换句话说,它没有提供任何附加值,只是一种更复杂的方式来确定某个位置是否被其提供者标记为模拟。 请参阅此处了解更多信息。
    所以我肯定会推荐使用.isFromMockProvider()

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

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

这个答案似乎对我不起作用。 extras.getBoolean(FusedLocationProviderApi.KEY_MOCK_LOCATION, false)总是返回 false。

但是,我这样做了:

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

我开始得到正确的结果。

在 marshmallow 中,您可以使用 AppOpsManager 检查 mock_location。

类似的答案: How to read selected mock location app in Android M - API 23

这不工作总是返回 false 并且 FusedLocationProviderApi 已被弃用。

extras.getBoolean(FusedLocationProviderApi.KEY_MOCK_LOCATION, false)

以下方法适用于我正确检测模拟位置

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM