Je suis tombé sur ce fil quelques années plus tard. En 2016, la plupart des appareils Android auront un niveau d'API> = 18 et devraient donc s'appuyer sur Location.isFromMockProvider () comme l'a souligné Fernando .
J'ai beaucoup expérimenté avec des emplacements faux / simulés sur différents appareils et distributions Android. Malheureusement .isFromMockProvider () n'est pas fiable à 100%. De temps en temps, un faux emplacement ne sera pas qualifié de faux . Cela semble être dû à une logique de fusion interne erronée dans l'API Google Location.
J'ai écrit un article de blog détaillé à ce sujet , si vous voulez en savoir plus. Pour résumer, si vous vous abonnez aux mises à jour de localisation à partir de l'API Location, puis activez une fausse application GPS et imprimez le résultat de chaque Location.toString () sur la console, vous verrez quelque chose comme ceci:
Remarquez comment, dans le flux de mises à jour d'emplacement, un emplacement a les mêmes coordonnées que les autres, mais n'est pas signalé comme une simulation et a une précision de localisation beaucoup plus faible.
Pour remédier à ce problème, je l' ai écrit une classe utilitaire qui va Suppress les positions fictives de manière fiable dans toutes les versions Android modernes (niveau API 15 et plus):
LocationAssistant - Mises à jour de localisation sans tracas sur Android
Fondamentalement, il «se méfie» des emplacements non simulés qui se trouvent à moins de 1 km du dernier emplacement fictif connu et les qualifie également de simulacre. Il le fait jusqu'à ce qu'un nombre significatif d'emplacements non simulés soit arrivé. L' assistant de localisation peut non seulement rejeter des emplacements fictifs, mais également vous soulager de la plupart des tracas liés à la configuration et à l'abonnement aux mises à jour de localisation.
Pour recevoir uniquement des mises à jour de localisation réelle (c'est-à-dire supprimer les simulations), utilisez-le comme suit:
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()
ne sera désormais invoqué qu'avec des informations de localisation réelles. Il y a d'autres méthodes d'écoute que vous devez implémenter, mais dans le contexte de votre question (comment empêcher l'usurpation GPS), c'est essentiellement cela.
Bien sûr, avec un système d'exploitation enraciné, vous pouvez toujours trouver des moyens d'usurper les informations de localisation qui sont impossibles à détecter pour les applications normales.