2013-02-25 45 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