Natknąłem się na ten wątek kilka lat później. W 2016 r. Większość urządzeń z Androidem będzie miała poziom API> = 18 i dlatego powinno polegać na Location.isFromMockProvider (), jak wskazał Fernando .
Intensywnie eksperymentowałem z fałszywymi / pozorowanymi lokalizacjami na różnych urządzeniach z Androidem i dystrybucjach. Niestety .isFromMockProvider () nie jest w 100% wiarygodne. Od czasu do czasu fałszywa lokalizacja nie będzie oznaczona jako pozorna . Wydaje się, że jest to spowodowane błędną wewnętrzną logiką fuzji w Google Location API.
Napisałem na ten temat szczegółowy post na blogu , jeśli chcesz dowiedzieć się więcej. Podsumowując, jeśli subskrybujesz aktualizacje lokalizacji z interfejsu API lokalizacji, a następnie włączasz fałszywą aplikację GPS i drukujesz wynik każdego Location.toString () na konsoli, zobaczysz coś takiego:
Zwróć uwagę, że w strumieniu aktualizacji lokalizacji jedna lokalizacja ma te same współrzędne co inne, ale nie jest oznaczona jako pozorna i ma znacznie gorszą dokładność lokalizacji.
Aby rozwiązać ten problem, napisałem klasę narzędzi, która niezawodnie blokuje lokalizacje Mock we wszystkich nowoczesnych wersjach Androida (poziom API 15 i nowsze):
LocationAssistant - Bezproblemowe aktualizacje lokalizacji na Androida
Zasadniczo „nie ufa” niezamierzonym lokalizacjom, które znajdują się w promieniu 1 km od ostatniej znanej pozorowanej lokalizacji, a także określa je jako pozorowane. Robi to, dopóki nie pojawi się znaczna liczba nieudanych lokalizacji. LocationAssistant można nie tylko odrzucić pozorowanie lokalizacji, ale także odciąża cię z większości kłopotów konfigurowania i subskrypcji aktualizacji lokalizacji.
Aby otrzymywać tylko prawdziwe aktualizacje lokalizacji (tj. Pomijać fałszywe informacje), użyj ich w następujący sposób:
public class MyActivity extends Activity implements LocationAssistant.Listener {
private LocationAssistant assistant;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
assistant = new LocationAssistant(this, this, LocationAssistant.Accuracy.HIGH, 5000, false);
}
@Override
protected void onResume() {
super.onResume();
assistant.start();
}
@Override
protected void onPause() {
assistant.stop();
super.onPause();
}
@Override
public void onNewLocationAvailable(Location location) {
}
...
}
onNewLocationAvailable()
będą teraz wywoływane tylko z prawdziwymi informacjami o lokalizacji. Jest jeszcze kilka metod nasłuchujących, które musisz wdrożyć, ale w kontekście twojego pytania (jak zapobiegać fałszowaniu GPS) to w zasadzie wszystko.
Oczywiście w przypadku zrootowanego systemu operacyjnego nadal można znaleźć sposoby fałszowania informacji o lokalizacji, których normalne aplikacje nie mogą wykryć.