Android:模拟位置几秒钟后变回原始

我有一个Android应用程序,我需要用户嘲笑他们的当前位置。 下面是我使用的代码,让我们用户按绿色button开始嘲笑他们的位置。

下面的代码在“绿色button”被按下时开始伪造位置。

greenButton.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View view) { LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); lm.addTestProvider(LocationManager.GPS_PROVIDER, "requiresNetwork" == "", "requiresSatellite" == "", "requiresCell" == "", "hasMonetaryCost" == "", "supportsAltitude" == "", "supportsSpeed" == "", "supportsBearing" == "", Criteria.POWER_LOW, Criteria.ACCURACY_FINE); Location newLocation = new Location(LocationManager.GPS_PROVIDER); newLocation.setLatitude(fakeLocation.getLatitude()); newLocation.setLongitude(fakeLocation.getLongitude()); newLocation.setAccuracy(fakeLocation.getAccuracy()); newLocation.setTime(System.currentTimeMillis()); newLocation.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos()); lm.setTestProviderEnabled(LocationManager.GPS_PROVIDER, true); lm.setTestProviderStatus(LocationManager.GPS_PROVIDER, LocationProvider.AVAILABLE, null, System.currentTimeMillis()); lm.setTestProviderLocation(LocationManager.GPS_PROVIDER, newLocation); } }); 

当我在地图上放置一个标记,然后按下绿色button。 地点嘲笑开始。 这个“假的地点”成为我现在的位置。

但是在10-20秒之后,嘲讽就结束了。 我的“真实位置”成为我目前的位置。 我在网上看到很多例子,他们使用我用来模拟位置的相同代码。 我不知道为什么这发生在我的应用程序。 任何帮助,将不胜感激。

  • 如何在标记下移动地图?
  • 在Google地图Android V2中触发地图事件(如点击标记)
  • 用gmaps v2开始虚拟游览
  • Google地图精确度问题
  • Google Maps API V2无法加载地图。 无法联系Google服务器,即使我检查权限和密钥库
  • 无法导入com.google.android.maps.MapActivity
  • 在google maps api v2中更改标记的InfoWindow视图的边距颜色
  • 在一个片段内调用的Google地图返回null
  • 首先,位置请求会影响你的模拟位置适合的位置提供商。

    如果您为GPS提供商创build并设置模拟位置,然后再次对GPS提供商进行位置请求,模拟的位置将一直保留,直到GPS硬件接收到新的位置。 这可能需要10-20秒或更多( 但如10-20秒后,嘲笑刚刚结束…

    而且这个问题也是一些假的位置应用程序的问题的答案。 你可以看到像“使用这个应用程序后,我无法得到我真正的当前位置! 在市场上。 因为他们需要做出位置请求。

    最后,请在服务中循环嘲笑操作。 我build议在后台线程上做,也许在每个1或2秒。 通过这种方式,可以减less其他应用程序可能的位置请求的影响。

     Handler mHandler; private void loopMocking(){ mHandler.post(mMockRunnable); } private Runnable mMockRunnable = new Runnable() { @Override public void run() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { newLocation.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos()); } newLocation.setTime(System.currentTimeMillis()); lm.setTestProviderLocation(LocationManager.GPS_PROVIDER, newLocation); mHandler.postDelayed(mMockRunnable, 1000); // At each 1 second } }; 

    尝试停止设置假地点后的更新。

     yourLocationManager.removeUpdates(yourLocationListener); 

    有关更多信息,请参阅https://developer.android.com/reference/android/location/LocationManager.html

    设置模拟位置后,您必须停止获取更多的位置请求。

    使用manager.removeUpdates(this)。 正如文档所述 :

    使用给定的LocationListener删除当前活动的位置更新的当前注册。 在这个调用之后,这个监听器将不再进行更新。 因此你的模拟位置将保持不变。