2016-06-14 68 views
0

我试图对使用模拟位置来操纵我的应用的人设置一些保护。我意识到这是不可能的,以防止100%...我只是想尽我所能。检测模拟位置不工作(Android)

该应用程序在其主要活动中使用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工作室(Nexus One的API 23模拟器运行应用程序),我使用扩展控件(模拟),应用程序只是继续正常工作设置位置,因此它似乎条件:

if (Build.VERSION.SDK_INT > 17 && mCurrentLocation.isFromMockProvider()) 

是返回false。

这对我没有任何意义。有谁知道为什么会发生?

谢谢!

回答

1

简短回答:.isFromMockProvider是不可靠的。某些假冒的地点没有被正确地检测到。 我花了大量的时间研究这个问题,并写了一个关于它的detailed blog post

我也花时间找到一个解决方案,可靠地抑制所有最近/相关Android版本中的模拟位置,并创建一个实用工具类,名为LocationAssistant,可以完成这项工作。

一言以蔽之(使用上述LocationAssistant):在你的清单

  1. 设置权限和谷歌播放服务在你的文件的gradle。

  2. 将文件LocationAssistant.java复制到您的项目中。

  3. 在您的活动的onCreate()方法中,实例化具有所需参数的LocationAssistant。例如,要大致每5秒接收一次高精度位置更新()并拒绝模拟位置,请致电new LocationAssistant(this, this, LocationAssistant.Accuracy.HIGH, 5000, false)。最后一个参数指定不应允许模拟位置。

  4. 开始/停止助手与您的活动,并通知权限/位置设置的变化(详见documentation)。

  5. 享受位置更新onNewLocationAvailable(Location location)。如果您选择拒绝模拟位置,则仅在非模拟位置调用回调。

有一些更多的实现方法,但本质上这是它。很明显,有一些方法可以避免使用根目录设备进行模拟供应商检测,但是在库存情况下,拒绝应该可靠地工作。

+0

谢谢你这样一个很好的答案和所有的contibutions。顺便说一句,我在最后一分钟抛弃了谷歌播放服务(因为在尝试为我的应用实施“谷歌播放服务检查”之后,我意识到他们不处理谷歌播放服务/播放存储缺乏的情况 - 我的应用程序只会挂起,他们的指令很混乱,谷歌播放服务从用户的角度来看令人讨厌/令人毛骨悚然)。所以我正在实现一种超级基本的GPS方式。我可能会改变主意,但无论在哪种情况下,我都会在您的博客上阅读。 –

+0

如果地理围栏的情况相同,该怎么办? –