2016-12-17 11 views
8

Mam aplikację na Androida, w której potrzebuję użytkownika, aby kpić z ich bieżącej lokalizacji. Poniżej znajduje się kod, którego używam, a następnie naciśnij zielony przycisk, aby rozpocząć kpiny z ich lokalizacji.Android: Mock Lokalizacja zmienia się z powrotem na oryginalny po kilku sekundach

Poniższy kod rozpoczyna symulację lokalizacji po naciśnięciu "zielonego przycisku".

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); 
     } 
}); 

Po umieszczeniu znacznika na mapie i naciśnięciu zielonego przycisku. Rozpoczęcie kpiny z lokalizacji. Ta "fałszywa lokalizacja" staje się moją bieżącą lokalizacją.

Ale po około 10-20 sekundach kpiny właśnie się kończą. Moja "prawdziwa lokalizacja" staje się moją bieżącą lokalizacją. Widziałem wiele przykładów online i używają tego samego kodu, którego używam do kpiny z lokalizacji. Nie wiem, dlaczego tak się dzieje z moją aplikacją. Każda pomoc będzie doceniona.

Odpowiedz

2

Przede wszystkim żądanie lokalizacji wpłynie na twoją pozorowaną lokalizację dla właściwego dostawcy lokalizacji.

Jeśli utworzysz i ustawi próbną lokalizację dla dostawcy GPS, a następnie ponownie zgłosi się żądanie lokalizacji dla dostawcy GPS, fałszywa zostanie utrwalona, ​​aż sprzęt GPS otrzyma świeżą lokalizację. Może to zająć 10-20 sekund lub więcej (Ale po 10-20 sekundach kpiny właśnie się kończą ...)

To także jest odpowiedź na problem z fałszywą lokalizacją aplikacji. Możesz zobaczyć komentarze typu "Nie mogę uzyskać mojej aktualnej bieżącej lokalizacji po użyciu tej aplikacji !!!" na rynku. Ponieważ muszą one składać prośbę o położenie, tak jak Ty.

I na koniec zapętlmy operację szyderczą. Proponuję robić to na tle wątku, może za każdym razem 1 lub 2 sekundy. W ten sposób można zmniejszyć wpływ ewentualnego żądania lokalizacji innych aplikacji.

Handler mHandler; 

private void loopMocking(){ 
    mHandler.post(mMockRunnable); 
} 

private Runnable mMockRunnable = new Runnable() { 
    @Override 
    public void run() { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
      newLocation.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos()); 
     } 

     newLocation.setTime(System.currentTimeMillis()); 
     lm.setTestProviderLocation(LocationManager.GPS_PROVIDER, newLocation); 

     mHandler.postDelayed(mMockRunnable, 1000); // At each 1 second 
    } 
}; 
+0

To zadziałało idealnie! Dziękuję Ci –

-1

Musisz przestać coraz więcej żądań lokalizacji po ustawieniu mock lokalizację.

użyj manager.removeUpdates (this). Ponieważ documentation mówi:

Usuwa bieżącą rejestrację aktualizacji lokalizacji bieżącego działania z podanego LocationListener. Po tym wywołaniu aktualizacje nie będą już występować dla tego słuchacza. Dlatego twoja pozorowana lokalizacja pozostanie ustawiona.

Powiązane problemy