2013-02-25 48 views
2

我创建了一个模拟gps位置的Android应用程序,它的作品非常适合大多数程序,如igo,waze,osmAnd,GPS状态等,但不适用于谷歌地图仍然显示我的实际位置。Android模拟位置不适用于谷歌地图

我禁用了gps和网络位置。

任何想法是为什么?如何解决它?由于

我使用的代码:

public void setLocation(double latitude, double longitude, double altitude, float bearing, float speed){ 
    String PROVIDER_NAME = LocationManager.GPS_PROVIDER; 
    locationManager.addTestProvider(PROVIDER_NAME, false, false, false, false, true, true, true, Criteria.POWER_LOW, Criteria.ACCURACY_FINE); 

    locationManager.setTestProviderEnabled(PROVIDER_NAME, true); 
    locationManager.setTestProviderStatus(PROVIDER_NAME, LocationProvider.AVAILABLE, null, System.currentTimeMillis()); 

    Location location = new Location(PROVIDER_NAME); 
    location.setLatitude(latitude); 
    location.setLongitude(longitude); 
    location.setAltitude(altitude); 
    location.setBearing(bearing); 
    location.setSpeed(speed); 
    location.setTime(System.currentTimeMillis()); 
    locationManager.setTestProviderLocation(PROVIDER_NAME, location.getLocation()); 
} 
+0

要使用你必须把你想用模拟物locations-工作它是一个单独的许可您的清单一个模拟的位置。你确定谷歌地图有这样的权限吗?它可能已经决定不有意使用模拟。 – 2013-02-25 16:11:24

+0

感谢您的帮助。我想他们已经在其他模拟程序中使用它,比如在“伪造我的位置”的作品中。 – Arnold 2013-02-25 16:16:02

+0

我的猜测是Google Map的活动/片段在被带到前台时采取行动,以避免成为欺骗场所的受害者。 模拟LocationProviders在系统范围内生效,这也意味着另一个应用程序可以删除您的应用程序添加的模拟提供程序。如果您在查看Google地图后返回Waze,那么Waze是否仍会收到您的模拟GPS位置更新? – 2013-02-27 23:13:09

回答

1

感谢您的帮助。 我发现了这个问题,似乎护目镜需要设置其他的应用程序不需要它的准确性 所以添加行location.setAccuracy(1);它解决了这个问题。

+0

谢谢,这对我也是这样! – 3lectrologos 2013-11-20 21:13:49

+0

标记为答案? – JohnyTex 2016-11-21 08:28:36

2

您应该使用GoogleMap.setLocationSource(LocationSource source)为Android上的最新Google Maps SDK提供随机位置。使用一个随机位置来源是这样的:

// In your MapFragment implementation or similar 
if (BuildConfig.DEBUG) 
    map.setLocationSource(new MockLocationSource()); 

MockLocationSource.java: 
public class MockLocationSource implements LocationSource { 

    private static final float ACCURACY = 1; // Meters 
    private static final int MAX_SPEED = 10; // m/s 
    private static final LatLng CENTER = new LatLng(59.91127, 10.70834); 
    private static final double DELTA_LAT = 0.0005; 
    private static final double DELTA_LON = 0.0005; 

    private static final long UPDATE_PERIOD = TimeUnit.SECONDS.toMillis(2); 

    private final Handler handler = new Handler(); 
    private LatLng lastCoordinate = CENTER; 
    private OnLocationChangedListener listener; 

    private void scheduleNewFix() { 
     handler.postDelayed(updateLocationRunnable, UPDATE_PERIOD); 
    } 

    private final Runnable updateLocationRunnable = new Runnable() { 

     @Override 
     public void run() { 
      Location randomLocation = generateRandomLocation(); 
      listener.onLocationChanged(randomLocation); 
      scheduleNewFix(); 
     } 
    }; 

    public Location generateRandomLocation() { 

     Location location = new Location(getClass().getSimpleName()); 
     location.setTime(System.currentTimeMillis()); 
     location.setAccuracy(ACCURACY); 
     location.setBearing(randomizer.nextInt(360)); 
     location.setSpeed(randomizer.nextInt(MAX_SPEED)); 
     location.setLatitude(lastCoordinate.latitude + scaleOffset(DELTA_LAT)); 
     location.setLongitude(lastCoordinate.longitude + scaleOffset(DELTA_LON)); 

     lastCoordinate = new LatLng(location.getLatitude(), location.getLongitude()); 

     return location; 
    } 

    private final static Random randomizer = new Random(); 

    private double scaleOffset(double value) { 
     return (randomizer.nextDouble() - 0.5) * value; 
    } 

    @Override 
    public void activate(OnLocationChangedListener locationChangedListener) { 
     listener = locationChangedListener; 
     scheduleNewFix(); 
    } 

    @Override 
    public void deactivate() { 
     handler.removeCallbacks(updateLocationRunnable); 
    } 

} 
+0

某些设备没有Google Maps SDK。 – skoperst 2015-05-25 12:47:54