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!
quelle
mLocationRequest.setSmallestDisplacement(10.0)
diese10 meters
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
quelle
Angenommen, der
setFastestInterval();
hat eine höhere Priorität für die Anforderung von aLocation
. Für jede App, die Sie festlegensetFastestInterval();
, wird diese App zuerst ausgeführt (auch wenn andere Apps verwendet werdenLocationServices
).ex: Wenn APP1 hat
setFastestInterval(1000 * 10)
und APP2 hatsetInterval(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 Sie
setFastestInterval()
zusammen mit dersetInterval()
App versuchen, eine Anfrage für die in der angegebene Zeit zu stellensetFastestInterval()
, stellt Ihre App daher alle 2 Minuten eine Anfrage .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
lat
undlong
auf den aktuellen Ort (mitgetLastLocation();
)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; }
quelle
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)).
quelle