Me encontré con este hilo un par de años después. En 2016, la mayoría de los dispositivos Android tendrán un nivel de API> = 18 y, por lo tanto, deberían confiar en Location.isFromMockProvider () como lo señaló Fernando .
Experimenté extensamente con ubicaciones falsas / simuladas en diferentes dispositivos y distribuciones de Android. Desafortunadamente .isFromMockProvider () no es 100% confiable. De vez en cuando, una ubicación falsa no se etiquetará como simulada . Esto parece deberse a una lógica de fusión interna errónea en la API de ubicación de Google.
Escribí una publicación de blog detallada sobre esto , si desea obtener más información. En resumen, si se suscribe a las actualizaciones de ubicación desde la API de ubicación, luego enciende una aplicación GPS falsa e imprime el resultado de cada Location.toString () en la consola, verá algo como esto:
Observe cómo, en el flujo de actualizaciones de ubicación, una ubicación tiene las mismas coordenadas que las demás, pero no está marcada como una simulación y tiene una precisión de ubicación mucho más pobre.
Para remediar este problema, escribí una clase de utilidad que se ubicaciones de prueba fiable a suprimir en todas las versiones de Android modernos (API nivel 15 en adelante):
LocationAssistant: actualizaciones de ubicación sin complicaciones en Android
Básicamente, "desconfía" de las ubicaciones no simuladas que se encuentran dentro de 1 km de la última ubicación simulada conocida y también las etiqueta como simuladas. Lo hace hasta que haya llegado un número significativo de ubicaciones no simuladas. El LocationAssistant no sólo puede rechazar ubicaciones de prueba, sino que también se desahoga de la mayor parte de la molestia de crear y suscribirse a las actualizaciones de ubicación.
Para recibir solo actualizaciones de ubicación reales (es decir, suprimir simulacros), utilícelo de la siguiente manera:
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()
ahora solo se invocará con información de ubicación real. Hay algunos métodos más de escucha que necesita implementar, pero en el contexto de su pregunta (cómo evitar la suplantación de GPS), básicamente es así.
Por supuesto, con un sistema operativo rooteado, aún puede encontrar formas de falsificar información de ubicación que son imposibles de detectar para las aplicaciones normales.