Question onLocationChanged n'est pas appelé sur certains périphériques


C'est une question qui a été posée à plusieurs reprises mais je n'ai pas pu trouver une solution qui fonctionne toujours.

Je développe une application en utilisant le fournisseur de localisation fusionné. dans le onConnected() méthode, je demande des mises à jour d'emplacement et la logique d'application sera lancée une fois qu'un correctif d'emplacement est généré et onLocationChanged() est appelé. (Veuillez vous référer à mon code ci-dessous).

Problème  onLocationChanged() la méthode n'est jamais appelée sur certains appareils. J'utilise un Samsung Tab 2 et un Samsung Galaxy Grand pour les tests. Ce code fonctionne parfaitement sur l'onglet 2 mais ne fonctionne pas sur Grand. Par ne fonctionne pas, je veux dire que locationClient se connecte mais onLocationChanged() n'est jamais appelé.

Plus tôt, j'ai utilisé le gestionnaire de localisation pour obtenir la localisation et dans cette implémentation, le même problème est survenu. Donc, j'ai essayé d'implémenter le fournisseur de localisation fusionné mais j'ai toujours le même problème.

Quelqu'un peut-il m'aider avec ce problème? Y a-t-il quelque chose qui me manque ici?

public class MainActivity extends Activity implements GooglePlayServicesClient.ConnectionCallbacks, OnConnectionFailedListener, LocationListener {

LocationClient locationclient;
LocationRequest lr;
Location loc1;
static String address;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);     

    locationclient = new LocationClient(this,this,this);
    locationclient.connect();        

}

@Override
public void onConnected(Bundle arg0) {
    // TODO Auto-generated method stub

    lr=LocationRequest.create();
    lr.setInterval(100);
    locationclient.requestLocationUpdates(lr, this);
    Log.d("LocationClient","On Connected");
}

@Override
public void onDisconnected() {
    // TODO Auto-generated method stub
    locationclient.disconnect();

}

@Override
public void onConnectionFailed(ConnectionResult arg0) {
    // TODO Auto-generated method stub

}

@Override
public void onLocationChanged(Location loc) {
    // TODO Auto-generated method stub      

    // Application Logic        

    Log.d("LocationClient","Last Known Location LC:" + loc.getLatitude() + "," + loc.getLongitude());
}
}

16
2017-08-07 17:08


origine


Réponses:


lr.setInterval(100); 

avec elle, votre intervalle est de 0,1 seconde, il est donc très difficile pour le chipset GPS de détecter un emplacement. Votre intervalle devrait être> 1 seconde (avec moi, il est> 10)

locationRequest il devrait être défini:

setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)  car PRIORITY_BALANCED_POWER_ACCURACY en extérieur, il ne trouve pas de lieu. Le code ressemblera à:

lr=LocationRequest.create();

lr.setInterval(5 * 1000);// 5s

lr.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
locationclient.requestLocationUpdates(lr, this);

J'espère que cette aide


2
2018-01-08 07:17



J'ai observé le même comportement sur Galaxy Nexus et reconnu deux choses causant onLocationChanged() à ne pas être appelé. Il y a

  1. La source d'emplacement correspondante n'est pas activée dans les paramètres système. Pour PRIORITY_HIGH_ACCURACY la Satellites GPS doit être activé, pour PRIORITY_BALANCED_POWER_ACCURACY  Localisation Wi-Fi et réseau mobile doit être activé.

  2. Même pour les sources de localisation activées, aucune information de localisation valide ne peut être disponible. Par exemple, PRIORITY_HIGH_ACCURACY la source est activée, mais il n'y a pas (ou pas bien) de réception GPS (par exemple, l'appareil est à l'intérieur d'un bâtiment). Ou PRIORITY_BALANCED_POWER_ACCURACY la source est activée, mais les données Wi-Fi et mobiles sont désactivées. Dans ces cas, l’emplacement ne peut pas être détecté et onLocationChanged() ne sera pas appelé.

Pour résoudre le problème n ° 1, je devais vérifier si les sources d'emplacement requises étaient activées avant de me connecter à l'API Google Services et, si elles étaient désactivées, j'ai averti un utilisateur qu'il lui autorisait l'accès à l'emplacement.

Pour résoudre le n ° 2 j'ai décidé d'utiliser LocationRequest.setExpirationDuration(). Je mets le timeout à environ 10 secondes et immédiatement après avoir appelé requestLocationUpdates() Je poste un rappel retardé de 10 secondes. Si le rappel différé est appelé avant requestLocationUpdates(), cela signifie que l'emplacement ne peut pas être détecté en raison de la raison n ° 2. Je fais trois tentatives, puis affiche un message d'erreur.

La documentation Android n'est pas géniale à cet endroit, c'est pourquoi j'espère que cela vous aidera.


2
2018-01-07 21:27



Voyez si vous obtenez un emplacement passé en testant si (loc == null). Même si c'est le même fournisseur, peut-être un périphérique revient-il à zéro et bombarde-t-il, ce qui donne l'impression qu'il ne se déclenche pas.


0
2017-08-07 17:17



Cela peut sembler insensé mais j'ai déjà fait face à ce problème, quelqu'un m'a suggéré de créer le vôtre LocationListenerau lieu de laisser votre MainActivity met en oeuvre LocationListener. Fondamentalement ceci:

locationclient.requestLocationUpdates(lr, your_location_listener);

J'espère que cela t'aides.


0
2017-08-08 03:32



J'ai résolu ce problème en définissant les deux paramètres, la distance minimale et le temps minimum entre les mises à jour sur 0. Selon ce que j'ai testé sur 2 appareils, onLocationChanged () est appelé régulièrement après avoir demandé des mises à jour.


0
2017-08-14 09:36



essayer de supprimer et réinstaller "google play services". Installez-le à partir du lien google market link, services Google Play


0
2018-03-27 09:29



Ici Vérifiez ce code ...

public class MyActivity extends Activity implements LocationListener {
double destLat, destLong;

LocationManager locationManager;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);

}

@Override
public void onLocationChanged(Location location) {
    // TODO Auto-generated method stub
    destLat = location.getLatitude();
    destLong = location.getLongitude();
}

@Override
public void onProviderDisabled(String provider) {
    // TODO Auto-generated method stub

}

@Override
public void onProviderEnabled(String provider) {
    // TODO Auto-generated method stub

}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
    // TODO Auto-generated method stub

}

-1
2017-12-06 11:11