web-dev-qa-db-fra.com

Différence entre LocationRequest setInterval (long millis) et LocationRequest setFastestInterval (long millis)

J'écris mes propres mises à jour d'emplacement d'arrière-plan toutes les 5 minutes sous Android. J'aimerais connaître la différence entre setInterval et setFastestInterval

Quand je setInterval à 5 ​​minutes et setFastestInterval à 2 minutes. La mise à jour de l'emplacement est appelée toutes les 2 minutes.

J'aimerais connaître la différence. Je ne comprenais pas ce qui est écrit exactement dans la page du développeur pour cela https://developer.Android.com/reference/com/google/Android/gms/location/LocationRequest.html

En outre: existe-t-il une fonction intégrée permettant de vérifier les mises à jour d'emplacement uniquement si les distances de la première mise à jour sont supérieures à 20 mètres avec la deuxième mise à jour?

Merci!

67
TheDevMan

en regardant la référence par Android à:
https://developer.Android.com/reference/com/google/Android/gms/location/LocationRequest.html

setInterval (long) signifie - définissez l'intervalle dans lequel vous souhaitez obtenir des emplacements. setFastestInterval (long) signifie - si un emplacement est disponible plus tôt, vous pouvez l'obtenir (c'est-à-dire qu'une autre application utilise les services de localisation).

Par exemple, vous démarrez votre application et enregistrez-la via setInterval (60 * 1000), ce qui signifie que vous recevrez des mises à jour toutes les 60 secondes.
Vous appelez maintenant setFastestInterval (10 * 1000). Si vous êtes la seule application à utiliser les services de localisation, vous continuerez à recevoir des mises à jour toutes les 60 secondes. Si une autre application utilise les services de localisation avec un taux de mises à jour plus élevé, vous obtiendrez plus de mises à jour de localisation.

Je pense que cela a un impact positif sur la durée de vie de la batterie consommée par votre application. Vous définissez le délai maximal d'attente en indiquant que si une mise à jour est disponible, vous la souhaitez. La consommation de la batterie sera créditée à l'application qui a demandé les mises à jour les plus fréquentes et non les vôtres.

92
Ohad Zadok

En outre: existe-t-il une fonction intégrée permettant de vérifier les mises à jour d'emplacement uniquement si les distances de la première mise à jour sont supérieures à 20 mètres avec la deuxième mise à jour?

LocationRequest a une méthode que vous pouvez utiliser pour définir la distance minimale entre les mises à jour.

int minimumDistanceBetweenUpdates = 20;

LocationRequest request = new LocationRequest();
request.setMinimumDisplacement(minimumDistanceBetweenUpdates);
// ... request.setInterval(interval); etc
9
user2120910

J'écris mes propres mises à jour d'emplacement d'arrière-plan pour un intervalle de chaque 5 minutes sous Android. J'aimerais connaître la différence entre setIntervalet setFastestInterval

Supposons que la setFastestInterval(); ait une priorité plus élevée pour demander un Location. Quelle que soit l'application que vous définissez la setFastestInterval();, ce sera cette application qui sera exécutée en premier (même si d'autres applications utilisent LocationServices).

ex: Si APP1 a setFastestInterval(1000 * 10) et APP2 a setInterval(1000 * 10), les deux applications ont le même intervalle de demande . Mais c’est la APP1 qui fera la première demande. (c'est ce que j'ai compris, la réponse n'est peut-être pas correcte)

Quand je setInterval to 5 min et setFastestInterval to 2 min . Le location update Est appelé toutes les 2 minutes .

Si vous utilisez setFastestInterval() conjointement avec setInterval(), l'application essaiera de demander l'heure indiquée dans la setFastestInterval(), c'est pourquoi votre application en fait la demande. toutes les 2 minutes .

En outre: existe-t-il une fonction intégrée permettant de vérifier les mises à jour d'emplacement uniquement si les distances de la première mise à jour sont supérieures à 20 mètres avec la deuxième mise à jour?

Pour faire une demande tous les 20 mètres, vous pouvez créer un LocationModel

    public class LocationModel {
    private double latitude;

    private double longitude;
    public LocationModel(){
    }

    public double getLatitude() {
        return latitude;
    }

    public void setLatitude(double latitude) {
        this.latitude = latitude;
    }

    public double getLongitude() {
        return longitude;
    }

    public void setLongitude(double longitude) {
        this.longitude = longitude;
    }
}

et dans la première demande, vous définissez lat et long sur l'emplacement actuel (à l'aide de getLastLocation();)

alors onLocationChanged() vous obtenez les données de l'objet et comparez avec le new Current Location

float distanceInMeters = distFrom((float)locationObj.getLatitude(), (float)locationObj.getLongitude(), (float)mCurrentLocation.getLatitude(), (float)mCurrentLocation.getLongitude());

en utilisant cette fonction qui est aussi une suggestion des utilisateurs de SO

public static float distFrom(float lat1, float lng1, float lat2, float lng2) {
    double earthRadius = 6371; //kilometers
    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));
    float dist = (float) (earthRadius * c);

    return dist;
}
6
hrskrs

setInterval (long millis) Cet intervalle est inexact. Vous pouvez ne pas recevoir de mises à jour du tout (si aucune source d'emplacement n'est disponible), ou les recevoir plus lentement que demandé. Vous pouvez également les recevoir plus rapidement que demandé (si d'autres applications demandent un emplacement plus rapidement). Le taux le plus rapide de réception des mises à jour peut être contrôlé avec setFastestInterval (long). Par défaut, ce taux le plus rapide correspond à 6 fois la fréquence de l'intervalle.

setFastestInterval (long millis) Contrairement à setInterval (long), ce paramètre est exact. Votre application ne recevra jamais de mises à jour plus rapides que cette valeur. Si vous n'appelez pas cette méthode, un intervalle le plus rapide sera sélectionné pour vous. Ce sera une valeur plus rapide que votre intervalle actif (setInterval (long)).

1
Haritha Reddy