我有一个Android应用程序,我需要用户模拟他们当前的位置。 下面是我使用的代码,让用户按绿色按钮开始模拟他们的位置。
下面的代码开始伪造位置"绿色按钮"被按下了。
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);
}
});
当我在地图上放置标记并按绿色按钮时。位置嘲笑开始。那个"假位置"成为我现在的位置。
但是在10-20秒之后,嘲笑就结束了。我的真实位置"成为我现在的位置。我在网上看到了很多例子,他们使用我用来模拟位置的相同代码。我不知道为什么我的应用会发生这种情况。任何帮助将不胜感激。
答案 0 :(得分:3)
首先,位置请求会影响适当位置提供商的模拟位置。
如果您为GPS提供商创建并设置模拟位置,然后再次为GPS提供商发出位置请求,模拟的将保持不变,直到GPS硬件获得新的位置。这可能需要10-20秒或更长时间(但是在10-20秒之后,嘲笑刚刚结束...... )
此问题也是一些假位置应用程序问题的答案。你可以看到像&#34这样的评论;在使用这个应用程序后我无法获得我当前的真实位置!!!"在市场上。因为他们需要像你一样提出定位请求。
最后,请在服务中循环模拟操作。我建议在后台线程上进行,也许每1或2秒。通过这种方式,您可以减少对其他应用程序的可能位置请求的影响。
$scope.logo = 'localhost:3000/modules/images/default.png';
<img ng-src="{{logo}}">
答案 1 :(得分:0)
尝试在设置虚假位置后停止更新。
yourLocationManager.removeUpdates(yourLocationListener);
有关详细信息,请参阅https://developer.android.com/reference/android/location/LocationManager.html
答案 2 :(得分:-1)
设置模拟位置后,您必须停止获取更多位置请求。
使用manager.removeUpdates(this)。正如documentation所说:
使用给定的LocationListener删除当前活动的位置更新的任何当前注册。在此调用之后,此侦听器将不再进行更新。因此,您的模拟位置将保持设置。