Unterschied zwischen LocationRequest setInterval (lange Millis) und LocationRequest setFastestInterval (lange Millis)

78

Ich schreibe meine eigenen Hintergrund-Standort-Updates für alle 5 Minuten in Android. Ich möchte den Unterschied zwischen setInterval und setFastestInterval kennen

Wenn ich Intervall auf 5 Minuten und FastestInterval auf 2 Minuten setze. Die Standortaktualisierung wird alle 2 Minuten aufgerufen.

Ich würde gerne den Unterschied wissen. Ich konnte nicht verstehen, was genau auf der Entwicklerseite für diese https://developer.android.com/reference/com/google/android/gms/location/LocationRequest.html geschrieben steht

Außerdem: Gibt es eine eingebaute Funktion zum Überprüfen der Standortaktualisierungen nur, wenn die Entfernungen der ersten Aktualisierung mit der zweiten Aktualisierung mehr als 20 Meter betragen?

Vielen Dank!

TheDevMan
quelle

Antworten:

114

Basierend auf der relevanten Android-Dokumentation :

  • setInterval(long) bedeutet - Legen Sie das Intervall fest, in dem Sie Standorte abrufen möchten.
  • setFastestInterval(long) bedeutet - wenn ein Standort früher verfügbar ist, können Sie ihn erhalten (dh eine andere App verwendet die Standortdienste).

Sie starten beispielsweise Ihre Anwendung und registrieren sie über setInterval(60*1000). Dies bedeutet, dass Sie alle 60 Sekunden Updates erhalten.

Jetzt rufst du an setFastestInterval(10*1000). Wenn Sie die einzige App sind, die die Ortungsdienste nutzt, erhalten Sie ungefähr alle 60 Sekunden weiterhin Updates. Wenn eine andere App die Standortdienste mit einer höheren Aktualisierungsrate verwendet, erhalten Sie mehr Standortaktualisierungen (jedoch nicht häufiger als alle 10 Sekunden).

Ich glaube, dass dies einen guten Einfluss auf die von Ihrer App verbrauchte Akkulaufzeit hat. Sie definieren die maximale Wartezeit, während Sie sagen, dass Sie ein Update wünschen, wenn es verfügbar ist. Der Batterieverbrauch wird der App gutgeschrieben, die die häufigeren Updates angefordert hat, und nicht Ihrer.

Ohad Zadok
quelle
4
Vielen Dank für den Hinweis, dass der Batterieverbrauch der App gutgeschrieben wird, die ihn häufiger anfordert.
Amit Kumar
3
Wie in anderen Kommentaren erwähnt, können Sie auch die Option festlegen, um Standortaktualisierungen abzurufen, wenn die Mindestentfernungskriterien erfüllt sind. Verwenden Sie mLocationRequest.setSmallestDisplacement(10.0)diese 10 meters
Option
@ kishorer747 wow, ich werde das nur manuell implementieren, wenn ich deinen Kommentar nicht gelesen habe! Fühle dich jetzt albern.
Moses Aprico
1
In Bezug auf die Batterie ist der Weg von @ kishorer747 nicht effizient. Wenn keine andere App das GPS verwendet, wird nach Standortänderungen gesucht.
Ohad Zadok
Wenn Sie nur mit setFastestInterval fragen, ob es wahrscheinlich ist, dass ein Signal gestaut wird. weil wir von überall Signale bekommen, wenn wir in einer Stadt oder einem überfüllten Gebiet stehen?
Ashana.Jackol
9

Außerdem: Gibt es eine eingebaute Funktion zum Überprüfen der Standortaktualisierungen nur, wenn die Entfernungen der ersten Aktualisierung mit der zweiten Aktualisierung mehr als 20 Meter betragen?

LocationRequest verfügt über eine Methode, mit der Sie den Mindestabstand zwischen Aktualisierungen festlegen können.

int minimumDistanceBetweenUpdates = 20;

LocationRequest request = new LocationRequest();
request.setMinimumDisplacement(minimumDistanceBetweenUpdates);
// ... request.setInterval(interval); etc
user2120910
quelle
5
Verwenden Sie diese mLocationRequest.setSmallestDisplacement (SMALL_DISPLACEMENT_DISTANCE).
Syed Raza Mehdi
@ Syed Raza Mehdi warum ich es benutze?
Luke Cross
5

Ich schreibe meine eigenen Hintergrund-Standort-Updates für alle 5 Minuten in Android. Ich würde gerne den Unterschied zwischen setIntervalund kennensetFastestInterval

Angenommen, der setFastestInterval();hat eine höhere Priorität für die Anforderung von a Location. Für jede App, die Sie festlegen setFastestInterval();, wird diese App zuerst ausgeführt (auch wenn andere Apps verwendet werden LocationServices).

ex: Wenn APP1 hat setFastestInterval(1000 * 10)und APP2 hat setInterval(1000 * 10), beide APPS haben gleiches Abfrageintervall. Aber es ist die APP1 , die die erste Anfrage stellt. (das habe ich verstanden, die Antwort ist vielleicht nicht richtig)

Wenn ich setIntervalzu 5 Minuten und setFastestIntervalzu 2 Minuten . Das location updatewird alle 2 Minuten aufgerufen .

Wenn Sie setFastestInterval()zusammen mit der setInterval()App versuchen, eine Anfrage für die in der angegebene Zeit zu stellen setFastestInterval(), stellt Ihre App daher alle 2 Minuten eine Anfrage .

Außerdem: Gibt es eine eingebaute Funktion zum Überprüfen der Standortaktualisierungen nur, wenn die Entfernungen der ersten Aktualisierung mit der zweiten Aktualisierung mehr als 20 Meter betragen?

Um alle 20 Meter eine Anfrage zu stellen, können Sie eine erstellen 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;
    }
}

und in der ersten Anfrage setzen Sie das latund longauf den aktuellen Ort (mit getLastLocation();)

dann onLocationChanged()holst du die Daten vom Objekt und vergleichst sie mit demnew Current Location

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

mit dieser Funktion, die auch ein Vorschlag von Benutzern von ist 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;
}
hrskrs
quelle
7
Wenn Sie mit dem Standortobjekt von sdk arbeiten, gibt es eine Funktion distanceTo ==> developer.android.com/reference/android/location/…
mrroboaat
1

setInterval (long millis) Dieses Intervall ist ungenau. Möglicherweise erhalten Sie überhaupt keine Updates (wenn keine Standortquellen verfügbar sind), oder Sie erhalten sie möglicherweise langsamer als angefordert. Sie können sie auch schneller als angefordert empfangen (wenn andere Anwendungen den Standort in einem schnelleren Intervall anfordern). Die schnellste Rate, mit der Sie Updates erhalten, kann mit setFastestInterval (long) gesteuert werden. Standardmäßig beträgt diese schnellste Rate das 6-fache der Intervallfrequenz.

setFastestInterval (long millis) Im Gegensatz zu setInterval (long) ist dieser Parameter genau. Ihre Anwendung erhält niemals Updates schneller als dieser Wert. Wenn Sie diese Methode nicht aufrufen, wird ein schnellstes Intervall für Sie ausgewählt. Dies ist ein Wert, der schneller als Ihr aktives Intervall ist (setInterval (long)).

Haritha Reddy
quelle