2013-03-14 4 views
0

В настоящее время я тестирую приложение LocationProvider моего приложения Android, издеваясь над некоторыми данными GPS из файла, чтобы временно имитировать движение на реальном устройстве. Кроме того, я хочу переключиться с моих издевающихся данных на реальные данные «на лету». Следующий код отлично подходит для издевательских данных GPS, считанных из файла. Однако, когда я пытаюсь перестать насмехаться с данными GPS, мое текущее местоположение застревает в последнем прочитанном GPS-сигнале из файла.Mocking Android LocationProvider

Поскольку я не хочу менять код моего реального приложения для Android, я пишу свои издеваемые данные в LocationProvider, связанные с именем GPS_Provider. Приложения на основе местоположения могут считывать издеваемые данные, просто вызывая `requestLocationUpdates (LocationManager.GPS_Provider,,). Сложная часть - сбросить GPS LocationProvider, чтобы снова вернуть реальные данные. Здесь я застрял и не знаю, как настроить его снова.

private AssetManager assetManager; 
    private LocationManager locationManager; 

    private String locationProviderName = LocationManager.GPS_Provider; 

    private List<Location> allMockedPositions; 

    private Handler handler; 
    private int position; 

    private Runnable runner = new Runnable() { 

     @Override 
     public void run() { 
      if (position <= allMockedPositions.size()) {  
       Location mockedLocation = allMockedPositions.get(position++); 
       locationManager.setTestProviderLocation(locationProviderName, mockedLocation); 
       handler.postDelayed(runner, 500); 
      } 
     } 
    }; 

    public MockLocationProvider(Context context) { 
     assetManager = context.getAssets(); 
     locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); 
    } 

    public void startMockingLocation(Route route) { 
     allMockedPositions = LocationData.getRouteData(assetManager, route, locationProviderName); 
     startMocking(); 
    } 

    private void startMocking() {  
     position = 0; 
     handler = new Handler(); 
     handler.post(runner); 
    } 

    public void stopMockingLocation() { 
     locationManager.clearTestProviderLocation(locationProviderName); 
     stopMocking(); 
    } 

    private void stopMocking() { 
     handler.removeCallbacks(runner); 
    } 
+0

Вы делаете это на эмуляторе правильно? Не на реальном телефоне? – Rarw

+0

На реальном телефоне – Salamibrot

ответ

0

Вы должны реализовать LocationManager и LocationListener, чтобы получить текущее местоположение телефона, а затем использовать это место в вашем методе stopMockingLocation. У вас уже есть код LocationManager, но, как ссылка, документацию о том, как настроить эту систему обратного вызова, можно найти here и here.

В основном вы собираетесь настроить свой LocationManager для получения обновлений от беспроводной сети NETWORK_PROVIDER или GPS_PROVDER. Затем он будет загружать новую информацию о местоположении в LocationListener, если в ваших указанных параметрах зарегистрировано изменение (вы можете установить диапазон времени и расстояния, в пределах которого будет зарегистрировано изменение).

Наконец, в вашем LocationListener вы увидите метод onLocationChanged

private final LocationListener listener = new LocationListener() {  
    @Override  
    public void onLocationChanged(Location location) {   
    // A new location update is received. Do something useful with it.   
    }  
}; 

Это то, что называется, когда изменения местоположения телефона в течение времени и расстояния параметров можно определить. Если все, что вы хотите сделать, это получить местоположение пользователя после того, как вы перестанете насмехаться, вы можете просто создать переменную экземпляра, сохранить местоположение пользователя в этой переменной из метода onLocationChanged, а затем получить доступ к этому местоположению из вашего stopMockingLocation. В качестве альтернативы вы можете вызвать другие методы из onLocationChanged, но я не могу сделать рекомендацию, так как я не уверен, что вы делаете.

+0

Я просто хочу написать приложение, которое позволяет мне начинать и останавливать насмешливые данные GPS и переключаться между действиями и издевательскими данными GPS – Salamibrot

+0

Я получил это - я говорю, что вам нужно собирать данные GPS так что вы можете использовать его, как только перестанете насмехаться. Если вы используете функцию locationlistener для получения GPS-данных, тогда, когда вы перестанете насмехаться над местоположением, вы можете просто использовать местоположение GPS. Другого способа получить местоположение местоположения GPS с помощью locationlister/locationmanager нет. – Rarw

+0

Я мог бы также использовать getLastKnownPosition моего LocationManager, прежде чем я начну издеваться над данными GPS, но это не главное. Поскольку я пишу свой издевавшийся GPS внутри LocationProvider, связанный со строкой GPS_Provider, я не могу использовать его в обычном режиме после того, как я закончил насмешку. Каждый раз, когда я обращаюсь к очищенному LocationProvider с requestLocationUpdates (...), я получаю последнее издеваемое местоположение. После того, как я закончил насмешливые данные GPS, я мог бы добавить lastKnownPosition, чтобы получить его от LocationProvider, но это не позволит мне отслеживать фактическое движение после насмешек. – Salamibrot

Смежные вопросы