Stolperte ein paar Jahre später über diesen Thread. 2016 werden die meisten Android-Geräte eine API-Stufe> = 18 haben und sollten sich daher auf Location.isFromMockProvider () verlassen, wie von Fernando hervorgehoben .
Ich habe ausgiebig mit Fake / Mock-Standorten auf verschiedenen Android-Geräten und Distributionen experimentiert. Leider ist .isFromMockProvider () nicht 100% zuverlässig. Hin und wieder wird ein gefälschter Ort nicht als Schein gekennzeichnet . Dies scheint auf eine fehlerhafte interne Fusionslogik in der Google Location API zurückzuführen zu sein.
Ich habe einen ausführlichen Blog-Beitrag darüber geschrieben , wenn Sie mehr erfahren möchten. Zusammenfassend lässt sich sagen, dass Sie, wenn Sie Standortaktualisierungen über die Standort-API abonnieren, eine gefälschte GPS-App einschalten und das Ergebnis jeder Location.toString () auf der Konsole drucken , Folgendes sehen:
Beachten Sie, dass im Stream der Standortaktualisierungen ein Standort dieselben Koordinaten wie die anderen hat, jedoch nicht als Schein gekennzeichnet ist und eine viel schlechtere Standortgenauigkeit aufweist.
Um dieses Problem zu beheben, schrieb ich eine Utility - Klasse, wird zuverlässig unterdrücken Mock Standorte auf alle modernen Android - Versionen (API Level 15 und höher):
LocationAssistant - Problemlose Standortaktualisierungen für Android
Grundsätzlich "misstraut" es Nicht-Scheinorten, die sich innerhalb von 1 km vom letzten bekannten Scheinort befinden, und bezeichnet sie auch als Schein. Dies geschieht so lange, bis eine erhebliche Anzahl von nicht nachgebildeten Standorten eingetroffen ist. Der LocationAssistant kann nicht nur Scheinstandorte ablehnen, sondern entlastet Sie auch von den meisten Problemen beim Einrichten und Abonnieren von Standortaktualisierungen.
Verwenden Sie es wie folgt, um nur echte Standortaktualisierungen zu erhalten (dh Verspottungen zu unterdrücken):
public class MyActivity extends Activity implements LocationAssistant.Listener {
private LocationAssistant assistant;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
// You can specify a different accuracy and interval here.
// The last parameter (allowMockLocations) must be 'false' to suppress mock locations.
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) {
// No mock locations arriving here
}
...
}
onNewLocationAvailable()
wird jetzt nur noch mit realen Standortinformationen aufgerufen. Es gibt einige weitere Listener-Methoden, die Sie implementieren müssen, aber im Kontext Ihrer Frage (wie Sie GPS-Spoofing verhindern können) ist dies im Grunde genommen alles.
Natürlich können Sie mit einem verwurzelten Betriebssystem immer noch Möglichkeiten finden, Standortinformationen zu fälschen, die normale Apps nicht erkennen können.