2013-02-25 4 views
2

Я создал приложение для Android, которое издевается над местоположением gps, отлично работает с большинством таких программ, как igo, waze, osmAnd, статус GPS и т. Д., Но не с картами google, которые все еще показываю фактическое положение, в котором я нахожусь.Android Mock location не работает с картами google

Я отключил 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

Чтобы использовать макет местоположения, вы должны указать в своем манифесте, что хотите работать с ложными местоположениями, - это отдельное разрешение. Вы уверены, что на картах google есть это разрешение? Возможно, он решил не использовать издевательства нарочно. –

+0

Благодарим за помощь. Я предполагаю, что у них это есть, поскольку в других макетных программах, таких как «поддельное мое местоположение», его работы. – Arnold

+0

Я предполагаю, что действия/фрагменты Карты Google принимают меры, когда они выведены на передний план, чтобы не стать жертвой спуфинга местоположения. Mock LocationProviders вступают в силу в системном масштабе, что также означает, что другое приложение может удалить провайдера макетов, добавленного вашим приложением. Если вы вернетесь в Waze после просмотра Карт Google, Waze все еще будет получать ваши фальшивые обновления местоположения GPS? –

ответ

1

Спасибо за помощь. Я нашел проблему, кажется, что goggle требует установить Точность, когда другие приложения не нуждаются в этом , поэтому добавив строку location.setAccuracy(1);. Она решила проблему.

+0

Спасибо, что сделал это для меня! – 3lectrologos

+0

Отметить как ответ? – JohnyTex

2

Вы должны использовать GoogleMap.setLocationSource(LocationSource source) для обеспечения случайных местоположений до последнего SDK Google Maps на Android. Используйте случайное местонахождение источник примерно такой:

// 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

Некоторые устройства не имеют SDK Google Maps. – skoperst