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

Solutions Collecting From Web of "Android:模拟位置几秒钟后变回原始"

首先,位置请求会影响你的模拟位置适合的位置提供商。

如果您为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删除当前活动的位置更新的当前注册。 在这个调用之后,这个监听器将不再进行更新。 因此你的模拟位置将保持不变。