/ / Ich kann die Geschwindigkeit des Benutzers nicht bekommen, habe viele Methoden ausprobiert - Android, Standort

Ich kann die Geschwindigkeit des Benutzers nicht bekommen, habe viele Methoden ausprobiert - Android, Standort

Ich habe gerade versucht, die Geschwindigkeit des Benutzers zu bekommen.

Ich habe den Ort und die Zeit der beiden Punkte, aber es scheint, dass ich trotz vieler Versuche nur den richtigen Weg finde, die Geschwindigkeit zu berechnen.

Das versuche ich gerade jetzt:

    public void onLocationChanged(Location location) {
Toast.makeText(this, "Location Changed", Toast.LENGTH_SHORT).show();
if (settings == null) {
settings = getSharedPreferences(PREFS_NAME, 0);
}

int ExceedingLimit = settings.getInt("ExceedLimit", 10);
int LowerLimit = settings.getInt("LowerLimit", 2);
int UpperLimit = settings.getInt("UpperLimit", 12);

double speed = 0;
if (location != null) {
double calc_long = Math.pow(location.getLongitude() - OldLocation.getLongitude(), 2);
double calc_lat = Math.pow(location.getLatitude() - OldLocation.getLatitude(), 2);
double time = (double) location.getTime() - (double) OldLocation.getTime();
speed = Math.sqrt(calc_long + calc_lat) / time;
}
if (location != null && location.hasSpeed()) {
speed = location.getSpeed();
}

if (LowerLimit < speed && speed < UpperLimit) {
ExceedInstance += 1;
}

OldLocation = location;

Es scheint nicht zu funktionieren, da es auch bei Bewegung auf Null bleibt.

Ich initialisiere Old Location hier:

public void onConnected(Bundle connectionHint) {
Toast.makeText(this, "You have connected", Toast.LENGTH_LONG).show();
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(UPDATE_INTERVAL);
mLocationRequest.setFastestInterval(UPDATE_INTERVAL);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
PendingResult<LocationSettingsResult> result =
LocationServices.SettingsApi.checkLocationSettings(mLocationClient, mLocationSettingsRequest
);
result.setResultCallback(ViewingWindow.this);

if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
LocationServices.FusedLocationApi.requestLocationUpdates(mLocationClient, mLocationRequest, this);
OldLocation = LocationServices.FusedLocationApi.getLastLocation(mLocationClient);
}
}

Ich habe auch versucht, die beiden getrennt zu berechnen und die zwei zu teilen, aber es endete als Casting-Fehler und es blieb immer noch bei Null.

Das Casting funktioniert auch nicht. Wenn ich es zu Double gebe, gibt es mir E-10 bis E-11 Zahlen, absurd niedrig, aber immer noch verändert sich jedes Mal, wenn der Ort aktualisiert wird.

Das Problem ist, auch wenn ich mich bewege geht die Geschwindigkeit nicht.

Ich habe eigentlich keine Ahnung, warum das alles falsch ist. Kann mir jemand helfen?

Antworten:

1 für die Antwort № 1

Hast du versucht, die benötigte Zeit zu verdoppeln?

speed = (double)Math.sqrt(
Math.pow(location.getLongitude() - OldLocation.getLongitude(), 2)
+ Math.pow(location.getLatitude() - OldLocation.getLatitude(), 2)
) / (double)(location.getTime() - OldLocation.getTime());

Weil ich nicht weiß, was die Math.sqrt () zurückgibt. Es kann wieder ein Float sein, weil es in der Berechnung viel schneller ist.

Wenn Ihre Geschwindigkeit nicht zu hoch ist, können Sie auch die Geschwindigkeitsvariable in Float ändern.


1 für die Antwort № 2

Versuche dies

double calc_long = Math.pow(location.getLongitude() - OldLocation.getLongitude(), 2);
double calc_lat = Math.pow(location.getLatitude() - OldLocation.getLatitude(), 2);
double time = location.getTime() - OldLocation.getTime();

speed = (double) Math.sqrt(calc_long + calc_lat) / time;

Wie testen Sie die Geschwindigkeit? Aus meiner Erfahrung brauchen Länge und Breite ein paar Sekunden, um jede Bewegung zu aktualisieren und zu registrieren. Wenn Sie also versuchen, eine konstante Geschwindigkeit von etwa einer Minute beizubehalten (egal wie), sollte die Geschwindigkeitsanzeige ausgelöst werden.