Sono incappato in questo thread un paio di anni dopo. Nel 2016, la maggior parte dei dispositivi Android avrà un livello API> = 18 e dovrebbe quindi fare affidamento su Location.isFromMockProvider (), come sottolineato da Fernando .
Ho ampiamente sperimentato con posizioni false / fittizie su diversi dispositivi Android e distribuzioni. Sfortunatamente .isFromMockProvider () non è affidabile al 100%. Di tanto in tanto, un luogo falso non verrà etichettato come finto . Ciò sembra essere dovuto a una logica di fusione interna errata nell'API di Google Location.
Ho scritto un post dettagliato sul blog su questo , se vuoi saperne di più. Per riassumere, se ti iscrivi agli aggiornamenti di posizione dall'API di posizione, quindi accendi un'app GPS falsa e stampa il risultato di ogni Location.toString () sulla console, vedrai qualcosa del genere:
Si noti come, nel flusso di aggiornamenti della posizione, una posizione ha le stesse coordinate delle altre, ma non viene contrassegnata come una finta e ha una precisione della posizione molto inferiore.
Per rimediare a questo problema, ho scritto una classe di utilità che sarà posizioni simulate in modo affidabile Sopprimere in tutte le versioni di Android moderni (livello di API 15 in su):
LocationAssistant - Aggiornamenti di posizione senza problemi su Android
Fondamentalmente, "diffida" di posizioni non fittizie che si trovano entro 1 km dall'ultima posizione fittizia nota e le etichetta anche come fittizie. Lo fa fino a quando non arriva un numero significativo di posizioni non fittizie. Il LocationAssistant non può solo respingere posizioni simulate, ma si alleggerisce anche dalla maggior parte dei problemi di configurazione e la sottoscrizione di aggiornamenti di posizione.
Per ricevere solo aggiornamenti reali sulla posizione (cioè sopprimere i mock), usalo come segue:
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()
ora verrà richiamato solo con informazioni sulla posizione reale. Ci sono altri metodi di ascolto che devi implementare, ma nel contesto della tua domanda (come prevenire lo spoofing GPS) è fondamentalmente questo.
Ovviamente, con un sistema operativo rooted puoi ancora trovare modi per falsificare le informazioni sulla posizione che sono impossibili da rilevare per le normali app.