2016-10-28 1 views
0

Existe-t-il une alternative à cet appel qui forcera l'acquisition de nouvelles coordonnées à partir du matériel?Comment forcer une mise à jour d'emplacement sur Android

locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 

Le problème spécifique que j'ai est qu'ils utilisent le faux GPS pour simuler un emplacement. Ils le désactivent avant de lancer mon application, mais lorsque mon application se lance et effectue l'appel ci-dessus, elle reçoit toujours le dernier emplacement fictif.

Remarque: Nous l'avons supprimé des Options de développement en tant que fournisseur de simulateurs de gps et y avons mis fin. Nous l'avons même désinstallé. Donc, je suis certain que Android lui-même est toujours en cache la valeur fictive précédente et juste l'alimentation de mon application parce que le téléphone n'a pas bougé. En outre, dans la mesure où il n'y a pas de fournisseur fictif dans Options du développeur, Android LocationManager signale que l'emplacement fictif mis en cache n'est PAS mocké. Clairement un énorme bug.

Ce que je voudrais faire est de faire un appel qui FORCES le téléphone pour allumer le GPS et acquérir de nouvelles coordonnées. Malheureusement, je ne vois aucun moyen de le faire ...

Répondre

2

La réponse courte est que vous devez faire une demande de localisation pour ledit fournisseur. Le fournisseur a besoin d'un endroit frais.

Longtemps est;

Le problème spécifique que j'ai est qu'ils utilisent le faux GPS pour se moquer d'un emplacement. Ils le désactivent avant de lancer mon application, mais lorsque mon application se lance et effectue l'appel ci-dessus, elle reçoit toujours le dernier emplacement fictif.

Dans des circonstances normales getLastKnownLocation méthode renvoie l'emplacement mis en cache pour le fournisseur donné. Donc, obtenir l'emplacement simulé est prévu dans votre cas, car votre appareil n'a pas reçu emplacement frais encore

Note: Nous avons enlevé des options de développement en tant que fournisseur de GPS simulé et fait une force quit dessus. Nous l'avons même désinstallé. Donc, je suis certain que Android lui-même est toujours en cache la valeur fictive précédente et juste l'alimentation de mon application parce que le téléphone n'a pas bougé.

Ce qui est juste, parce que l'application de moqueur emplacement précédemment défini est mis en cache pour le fournisseur donné. Cela affecte tout le système. C'est pourquoi il n'est pas effacé après la désinstallation de l'application Mocker. Vous devez effectuer une demande de localisation pour le fournisseur ou redémarrer votre appareil.

En outre, parce qu'il n'y a pas de fournisseur fantaisie dans Options pour les développeurs, Android LocationManager signale l'emplacement faux en cache comme NOT moqué. Clairement un énorme bug.

Comment l'avez-vous testé?Tous les appareils se comportent comme ça lorsque vous testez? Peut-être que l'application moqueuse est installée en tant qu'application système, elle signale donc l'emplacement à LocationManager et vous dissimule?


Pour forcer le GPS à obtenir l'emplacement, vous pouvez facilement utiliser le code ci-dessous. La méthode onLocationChanged sera déclenchée par le matériel GPS.

Mais assurez-vous qu'une application de localisation fictives ne fonctionne pas à ce moment. Sinon, la méthode onLocationChanged sera déclenchée par l'application mocker!

private void requestLocation(){ 
    locationManager.requestLocationUpdates(
    LocationManager.GPS_PROVIDER, 0, 0, mListener); 
} 

private LocationListener mListener = new LocationListener() { 
    @Override 
    public void onLocationChanged(Location location) { 
     // Previously mock location is cleared. 
     // getLastKnownLocation(LocationManager.GPS_PROVIDER); will not return mock location. 
    } 

    ... 
}; 
+0

"La réponse courte est que vous devez effectuer une demande de localisation pour le fournisseur en question. Je fais cela en utilisant 'locationManager.getLastKnownLocation (LocationManager.GPS_PROVIDER);' mais il ne cesse de renvoyer la même valeur en cache. – Bungles

+0

"Comment l'avez-vous testé? Tous les appareils se comportent comme ça lorsque vous testez?" Oui, tous les appareils. Désinstallez l'application Fake GPS et désactivez complètement les options de développement. Puis printf() la valeur de 'lastKnownLocation.isFromMockProvider()', qui me dit que l'emplacement est mocké. NOTE: Ceci est même après le redémarrage de notre application, qui videra et renouvellera l'abonnement de notre application aux services de localisation. – Bungles

+0

En outre, AUCUNE de mes méthodes 'locationListener' n'a jamais été appelée pendant ou à la suite du changement de fournisseur GPS. Je trouve cela plus qu' impair parce qu'un fournisseur est désactivé (Faux GPS) et un autre est activé (Real GPS) pendant le changement. – Bungles

0

La solution la plus simple consiste à extraire les outils GPS d'Android. Il vous suffit d'extraire toutes vos fonctions liées au GPS dans une interface distincte et de l'implémenter pour les tester sans utiliser AUCUN service lié à Android. Ce faisant, vous n'aurez même pas besoin de vous moquer de vos emplacements (en supposant que votre implémentation Android finale fonctionnera correctement). Vous pouvez simuler cette implémentation de test de n'importe quelle façon, par exemple, ouvrir un fichier Json avec des locatioins à partir d'éléments et le transmettre périodiquement à votre interface. Voir cet article: http://martinfowler.com/articles/dipInTheWild.html

+0

Je ne ai pas besoin d'utiliser un service de localisation maquette. J'ai besoin d'informer l'utilisateur quand un service de localisation fictive est détecté. – Bungles

1

Ceci est un problème rapporté par Marshmallow. https://code.google.com/p/android/issues/detail?id=227873

+0

Bummer. Espérons que c'est quelque chose qu'ils priorisent. C'est un énorme problème pour les applications bancaires et les choses similaires qui nécessitent le géofencing. – Bungles

+0

@ Nguyen Phuc Thao pouvez-vous me donner votre contact alors nous pouvons essayer de trouver la solution. J'ai le même problème mais ne peux toujours pas trouver le moyen de réparer: (( –