[英]Detecting Mock Location Not Working (Android)
我正在尝试对使用模拟位置来操纵我的应用的用户设置某种保护措施。 我意识到不可能100%避免...我只是想尽我所能。
该应用程序在其主要活动中使用Google定位服务(游戏服务的一部分)。
onLocationChanged()方法为:
public void onLocationChanged(Location location) {
this.mCurrentLocation = location;
if (Build.VERSION.SDK_INT > 17 && mCurrentLocation.isFromMockProvider()) {
Log.i(TAG, "QQ Location is MOCK");
// TODO: add code to stop app
// otherwise, currently, location will never be updated and app will never start
} else {
Double LAT = mCurrentLocation.getLatitude();
Double LON = mCurrentLocation.getLongitude();
if ((LAT.doubleValue() > 33.309171) || (LAT.doubleValue() < 33.226442) || (LON.doubleValue() < -90.790165) || (LON.doubleValue() > -90.707081)) {
buildAlertMessageOutOfBounds();
} else if (waiting4FirstLocationUpdate) {
Log.i(TAG, "YYY onLocationChanged() determines this is the FIRST update.");
waiting4FirstLocationUpdate = false;
setContentView(R.layout.activity_main);
startDisplayingLists();
}
}
}
位置服务可以完美运行,并且通常与该应用程序都很好,但是当我在带有Android Studio(Nexus One API 23)的模拟器中运行该应用程序,并且使用扩展控件(模拟)设置位置后,该应用程序将继续运行正常工作,因此看起来情况如下:
if (Build.VERSION.SDK_INT > 17 && mCurrentLocation.isFromMockProvider())
返回假。
这对我来说毫无意义。 有谁知道为什么会这样?
谢谢!
简短的答案: .isFromMockProvider不可靠。 某些伪造位置无法正常检测到。 我花了大量时间研究此问题,并撰写了详细的博客文章 。
我还花了一些时间来找到一种解决方案,以可靠地抑制所有最新/相关Android版本中的模拟位置,并制作了一个名为LocationAssistant的实用程序类来完成这项工作。
简而言之(使用前面提到的LocationAssistant ):
在清单中设置权限,并在gradle文件中设置Google Play服务。
将文件LocationAssistant.java复制到您的项目中。
在Activity的onCreate()
方法中,使用所需参数实例化LocationAssistant
。 例如,要大致每5秒接收一次高精度位置更新并拒绝模拟位置 ,请调用new LocationAssistant(this, this, LocationAssistant.Accuracy.HIGH, 5000, false)
。 最后一个参数指定不应允许模拟位置。
使用“活动”启动/停止助手,并通知其权限/位置设置更改(有关详细信息,请参阅文档 )。
在onNewLocationAvailable(Location location)
享受位置更新。 如果选择拒绝模拟位置,则仅对非模拟位置调用回调。
还有其他一些方法可以实现,但实际上就是这样。 显然,有一些方法可以绕过带有根设备的模拟提供程序检测,但是在库存,无根设备上,拒绝应该可靠地工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.