web-dev-qa-db-fra.com

Le fournisseur de localisation fusionné setsmallestDisplacement ne fonctionne pas dans Android

Bonjour, j'ai implémenté le fournisseur de localisation Fused Api pour obtenir des mises à jour de localisation dans un service. J'ai pu déclencher l'événement onlocationchanged en fonction de l'intervalle défini. Cependant, lorsque j'ai défini le setsmallestDisplacement sur 10 mètres, l'événement est déclenché même si l'appareil est immobile. Quelqu'un at-il un problème similaire à celui-ci. veuillez fournir des suggestions. Ci-dessous le code

    mlocationrequest = LocationRequest.create();
    mlocationrequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    mlocationrequest.setInterval(60000); // Update location every 1 minute
    mlocationrequest.setFastestInterval(10000);
    mlocationrequest.setSmallestDisplacement(10);


    LocationServices.FusedLocationApi.requestLocationUpdates(
            mGoogleApiClient, mlocationrequest, this);

Pour trouver la distance entre deux valeurs d'emplacement, j'ai utilisé cette méthode.

public static float distFrom (float lat1, float lng1, float lat2, float lng2 ) 
{
    double earthRadius = 3958.75;
    double dLat = Math.toRadians(lat2-lat1);
    double dLng = Math.toRadians(lng2-lng1);
    double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
    Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) *
    Math.sin(dLng/2) * Math.sin(dLng/2);
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    double dist = earthRadius * c;

    int meterConversion = 1609;

    return new Float(dist * meterConversion).floatValue();
}

Mais j'obtiens les distances comme 43,51, 49,32, 520,02 même lorsque l'appareil est immobile. Est-ce parce que la tablette est utilisée à l'intérieur?

20
hemanth kumar

Si le déplacement est défini pour LocationRequest, aucune chance d'obtenir les emplacements si le périphérique est toujours car le déplacement a priorité sur les intervalles (intervalle et intervalle le plus rapide). Comme je pourrais le deviner - Vous avez peut-être passé différents objets LocationRequest (sans déplacement défini) à LocationServices.FusedLocationApi.requestLocationUpdates ().

Je cherchais une réponse à la façon dont les locs sont reçus si l'intervalle et le déplacement sont définis. Je viens de vérifier par moi-même avec mon application et ci-dessous le comportement de différentes configurations pour LocationRequest:

  1. Aucun jeu de paramètres de déplacement
    setInterval est réglé sur 1 min et le plus rapide sur 1 min.

    J'ai reçu l'emplacement toutes les minutes. Mais vous voyez parfois, il a reçu rapidement et parfois plus lentement, car setInterval est inexact.

06-03 11: 46: 55.408 25776-25776/MyLocationListener ﹕ onLocationChanged.
06-03 11: 47: 56.008 25776-25776/MyLocationListener ﹕ onLocationChanged.
06-03 11: 48: 18.768 25776-25776/MyLocationListener ﹕ onLocationChanged.
06-03 11: 49: 22.938 25776-25776/MyLocationListener ﹕ onLocationChanged.
06-03 11: 50: 22.948 25776-25776/MyLocationListener ﹕ onLocationChanged.
06-03 11: 52: 22.978 25776-25776/MyLocationListener ﹕ onLocationChanged.
06-03 11: 53: 22.998 25776-25776/MyLocationListener ﹕ onLocationChanged.

  1. Le paramètre de déplacement est fixé à 10 mètres
    setInterval as above 1 mins.

    Aucune mise à jour de position n'est reçue si l'appareil ne bouge pas ou ne franchit pas cette distance. Entre chaque onLocationChanged ci-dessous, j'ai marché plus de 10 mètres, j'ai donc reçu loc.

06-03 11: 26: 53.328 16709-16709/MyLocationListener ﹕ onLocationChanged.
06-03 11: 35: 38.318 16709-16709/MyLocationListener ﹕ onLocationChanged.
06-03 11: 39: 16.728 16709-16709/MyLocationListener ﹕ onLocationChanged.

39
cgr

Il peut arriver que vous obteniez un temps de lat différent dans la méthode onLocationChanged qui décrit plus de déplacement que 10. Donc, veuillez vérifier le temps de lat que vous obtenez et mesurer la distance une fois manuellement pour contre-vérifier les choses.

En dehors de ce qui précède, une autre raison possible est une question de priorité.Si le cas ci-dessus semble correct, essayez comme suit:

 mlocationrequest = LocationRequest.create();
mlocationrequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mlocationrequest.setSmallestDisplacement(10);
mlocationrequest.setInterval(60000); // Update location every 1 minute
mlocationrequest.setFastestInterval(10000);
5
Mehul Joisar