Android Distanz zwischen zwei Location

Julius99

Mitglied
Hallo zusammen,

ich bin Anfänger und bin im Moment dabei ein Jogging-App zu programmieren.
Hierbei möchte ich mir meine zurückgelegte Distanz anzeigen lassen.

Ich programmiere in Android Studio, meine Service sieht wie folgt aus:

Java:
package com.example.joggingapp;

import android.Manifest;
import android.app.Service;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;

import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;

import java.util.ArrayList;
import java.util.List;

public class WegAufzeichnungsService extends Service implements LocationListener {
    private LocationManager locationManager;
    public static Handler updateHandler;
    public static ArrayList<Location> weg = new ArrayList<Location>();

    public static Location oldLocation;
    public static Location newLocation;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;
        }
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, (LocationListener) this);
        //weg.clear();
    }

    @Override
    public void onDestroy() {
        locationManager.removeUpdates(this);
        super.onDestroy();
    }

    @Override
    public void onLocationChanged(@NonNull Location location) {
        weg.add(location);
        if (updateHandler != null) {
            updateHandler.sendEmptyMessage(1);
        }
    }
}

In der Main soll jedes mal, wenn eine neue Location aufgenommen wurde die Distanz zwischen der alten Location und der neuen Location berechnet werden.
Die Distanzen sollen zudem aufsummiert werden, da ich ja die Gesamtdistanz ab Start angezeigt haben möchte.

Die Methode, in der die Distanz berechnet werden soll, sieht wie folgt aus:

Java:
    private TextView vStrecke;
    private WegHandler handler = new WegHandler();
    public float currentDistanz;
    public float rundWeg;

    private class WegHandler extends Handler {
        @Override
        public void handleMessage(Message msg)
        {
            berechneStrecke();
        }
    }

    //Berechnung der zurückgelegten Distanz
    public void berechneStrecke()
    {
        List<Location> weg = WegAufzeichnungsService.weg;
        if(weg.size()>1)
        {
            for(int i=1; i<weg.size(); i++)
            {
                currentDistanz += ((weg.get(i-1).distanceTo(weg.get(i))) / 1000);
            }
        }
        rundWeg = (float)(((int)(currentDistanz*100))/100.0);
        vStrecke.setText(Float.toString(rundWeg));
    }

Nun habe ich das Problem, dass zwar etwas ausgegeben wird jedoch völlig unrealistische Werte.
Bsp: Ich laufe eine Strecke von 1,8km und meine App zeigt eine Distanz von rund 6000km..

Ich bin schon ewig auf Fehlersuche doch kann meinen Fehler einfach nicht finden.
Ich hoffe mir kann jemand weiterhelfen und bedanke mich schonmal im voraus für die Antworten!
 
Zuletzt bearbeitet:
Code in Code-Tags macht es etwas lesbarer.

Ein problem, was ich gegenfalls sehe - du setzt currentDistanz nie auf 0, das heißt, wenn die berechneStrecke mehrfach aufgerufen wird, wird die Strecke immer größer. Am Anfang von berechneStrecke würde ich den Wert mal auf 0 setzen.

Außerdem sollte die Berechnung von rundWeg nach der Schleife erfolgen und nicht bei jedem Duchlauf.
 
Code in Code-Tags macht es etwas lesbarer.
Tut mir Leid hatte es vor dem registrieren geschrieben, weshalb ich die Nachricht mit den "Regeln" erst danach bekam.
Ein problem, was ich gegenfalls sehe - du setzt currentDistanz nie auf 0, das heißt, wenn die berechneStrecke mehrfach aufgerufen wird, wird die Strecke immer größer. Am Anfang von berechneStrecke würde ich den Wert mal auf 0 setzen.
Naja ich rufe ja berechneStrecke immer wieder auf, sobald sich meine Location ändert. Würde ich jedes mal meine currentDistanz = 0 setzen, dann würde ich am Ende nicht meine Gesamtdisanz haben, oder nicht?
Außerdem sollte die Berechnung von rundWeg nach der Schleife erfolgen und nicht bei jedem Duchlauf.
stimmt, Danke!
 
Tut mir Leid hatte es vor dem registrieren geschrieben, weshalb ich die Nachricht mit den "Regeln" erst danach bekam.

Naja ich rufe ja berechneStrecke immer wieder auf, sobald sich meine Location ändert. Würde ich jedes mal meine currentDistanz = 0 setzen, dann würde ich am Ende nicht meine Gesamtdisanz haben, oder nicht?
Nein. Du rechnest ja jedes mal in berechneStrecke die Gesamtdistanz aus.

Wegpunkt 0: Keine Berechnung (Wert = 0)
Wegpunkt 1: Berechnung Abstand 0+1 + alter Wert (0)
Wegpunkt 2: Berechnung Abstand 0+1 + Abstand 1+2 + alter Wert (Der Alte Wert enthält aber schon den Abstand 0/1)
 
Nein. Du rechnest ja jedes mal in berechneStrecke die Gesamtdistanz aus.

Wegpunkt 0: Keine Berechnung (Wert = 0)
Wegpunkt 1: Berechnung Abstand 0+1 + alter Wert (0)
Wegpunkt 2: Berechnung Abstand 0+1 + Abstand 1+2 + alter Wert (Der Alte Wert enthält aber schon den Abstand 0/1)
Tatsache, jetzt sehe ich es. Danke!
Reicht es nicht wenn ich einfach anstatt "+=" nur "=" schreibe?
 
Zuletzt bearbeitet:
Es funktioniert! Vielen Dank!
Der Code sieht jetzt wie folgt aus:
Java:
    public void berechneStrecke()
    {
        currentDistanz = 0;
        List<Location> weg = WegAufzeichnungsService.weg;
        if(weg.size()>1)
        {
            for(int i=1; i<weg.size(); i++)
            {
                currentDistanz += ((weg.get(i-1).distanceTo(weg.get(i))) / 1000);
            }
        }
        rundWeg = (float)(((int)(currentDistanz*100))/100.0);
        vStrecke.setText(Float.toString(rundWeg));
    }

Manchmal ist man echt blind, obwohl es die einfachsten Dinge sind..
Saß schon mehrere Stunden davor und hab es nicht gesehen.
 
Muss mich doch nochmal melden..
Auch wenn ich mein Smartphone auf den Tisch lege und nicht bewege ändert sich die angezeigte Distanz.
Zwar nur sehr gering aber sie ändert sich.

Kann das an der GPS-Genauigkeit liegen?
Sprich meine Position/Location ändert sich geringfügig auch wenn ich eigentlich stehe.
 
Ich weiß nicht wie das auf Android funktioniert aber bei iOs kann man dem LocationManager sagen ab welcher Veränderung man notifications bekommen will. Das sollte man nur in den seltensten Fällen unter 5m stellen weil sonst schluckt deine App auch den ganzen Akku innerhalb von ein paar stunden.
 
Ich weiß nicht wie das auf Android funktioniert aber bei iOs kann man dem LocationManager sagen ab welcher Veränderung man notifications bekommen will. Das sollte man nur in den seltensten Fällen unter 5m stellen weil sonst schluckt deine App auch den ganzen Akku innerhalb von ein paar stunden.
Danke, das wäre auf jeden Fall sinnvoll.
Ich hatte danach schon einmal gesucht, leider habe ich bis jetzt noch nichts hilfreiches gefunden.
Eventuell kann jemand anders dabei weiterhelfen? 🙂
 
Danke, das wäre auf jeden Fall sinnvoll.
Ich hatte danach schon einmal gesucht, leider habe ich bis jetzt noch nichts hilfreiches gefunden.
Eventuell kann jemand anders dabei weiterhelfen? 🙂
Hat sich erledigt. ähnlich wie bei IOS Geräten stellt man es bei Android-Geräten über minTimeMS (10) oder minDistanceM (100) ein.
Siehe Code:
[CODE lang="java" highlight="15"] @Override
public void onCreate() {
super.onCreate();
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10, 100, (LocationListener) this);
weg.clear();
}[/CODE]
 

Neue Themen


Zurück
Oben