Tropecei neste tópico alguns anos depois. Em 2016, a maioria dos dispositivos Android terá nível de API> = 18 e, portanto, deve contar com Location.isFromMockProvider () como apontado por Fernando .
Eu experimentei extensivamente com locais falsos / simulados em diferentes dispositivos e distros Android. Infelizmente .isFromMockProvider () não é 100% confiável. De vez em quando, um local falso não será rotulado como fictício . Isso parece ser devido a alguma lógica de fusão interna incorreta na API de localização do Google.
Eu escrevi uma postagem detalhada no blog sobre isso , se você quiser saber mais. Para resumir, se você se inscrever para receber atualizações de localização da API Location, ativar um aplicativo GPS falso e imprimir o resultado de cada Location.toString () no console, você verá algo assim:
Observe como, no fluxo de atualizações de localização, uma localização tem as mesmas coordenadas que as outras, mas não é sinalizada como uma simulação e tem uma precisão de localização muito pior.
Para resolver esse problema, eu escrevi uma classe de utilitário que vai locais fictícios de forma confiável suprimir em todas as versões do Android modernos (nível API 15 e acima):
LocationAssistant - atualizações de localização sem complicações no Android
Basicamente, ele "desconfia" de locais não fictícios que estão a 1km do último local fictício conhecido e também os rotula como fictícios. Ele faz isso até que um número significativo de locais não simulados chegue. O LocationAssistant pode não apenas rejeitar locais fictícios, mas também livra você da maior parte do incômodo de configurar e assinar atualizações de locais.
Para receber apenas atualizações de localização real (ou seja, suprimir simulações), use-o da seguinte maneira:
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()
agora só será invocado com informações de localização real. Existem mais alguns métodos de ouvinte que você precisa implementar, mas no contexto da sua pergunta (como evitar spoofing de GPS), é basicamente isso.
Obviamente, com um sistema operacional enraizado, você ainda pode encontrar maneiras de falsificar informações de localização que são impossíveis de serem detectadas por apps normais.