Je suis tombé sur ce fil de discussion quelques années plus tard. En 2016, la plupart des appareils Android auront un niveau d'API >= 18 et devront donc s'appuyer sur Localisation.isFromMockProvider() comme l'a souligné Fernando .
J'ai longuement expérimenté les emplacements fictifs sur différents appareils Android et distros. Malheureusement, .isFromMockProvider() n'est pas fiable à 100%. De temps en temps, un emplacement factice ne sera pas étiqueté comme factice . Cela semble être dû à une logique de fusion interne erronée dans l'API de localisation de Google.
J'ai écrit un article de blog détaillé à ce sujet si vous souhaitez en savoir plus. En résumé, si vous vous abonnez aux mises à jour de l'emplacement à partir de l'API d'emplacement, puis que vous allumez une fausse application GPS et que vous imprimez le résultat de chaque déplacement de l Emplacement.toString() à la console, vous verrez quelque chose comme ceci :
Remarquez comment, dans le flux des mises à jour de localisation, un emplacement a les mêmes coordonnées que les autres, mais n'est pas signalé comme un simulacre et a une précision de localisation beaucoup plus faible.
Pour remédier à ce problème, j'ai écrit une classe utilitaire qui sera supprimer de manière fiable les emplacements Mock sur toutes les versions modernes d'Android (niveau 15 de l'API et plus) :
LocationAssistant - Des mises à jour de localisation sans souci sur Android
En gros, il se "méfie" des emplacements non simulés qui se trouvent à moins d'un kilomètre du dernier emplacement simulé connu et les identifie également comme simulés. Il procède ainsi jusqu'à ce qu'un nombre significatif d'emplacements non fictifs soient arrivés. Le site LocationAssistant peut non seulement rejeter les faux emplacements, mais aussi vous libérer de la plupart des tracas liés à la mise en place et à l'abonnement aux mises à jour des emplacements.
Pour recevoir uniquement les mises à jour des emplacements réels (c'est-à-dire supprimer les simulacres), utilisez-le comme suit :
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()
ne sera désormais invoqué qu'avec des informations de localisation réelles. Il existe d'autres méthodes d'écoute que vous devez mettre en œuvre, mais dans le contexte de votre question (comment empêcher l'usurpation d'identité par GPS), c'est à peu près tout.
Bien sûr, avec un système d'exploitation enraciné, vous pouvez toujours trouver des moyens de falsifier les informations de localisation qui sont impossibles à détecter par les applications normales.
2 votes
Je pense qu'il s'agit de la fonction Location Spoofing disponible dans la vue DDMS d'Eclipse.
2 votes
J'ai un jeu basé sur la localisation sur lequel je ne veux pas que les gens trichent, donc je veux bloquer l'usurpation d'identité, si je comprends bien, cela peut se produire de deux façons Avoir des emplacements fictifs activés, et construire une image personnalisée qui fait de l'usurpation de bas niveau et ne tient pas compte du paramètre d'usurpation dans l'application des paramètres. En essayant de trouver le fournisseur Settings.System pour MockLocations, ou en regardant s'il est activé (avec un écouteur au milieu de l'application).