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:

LimDul

Top Contributor
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.
 

Julius99

Mitglied
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!
 

LimDul

Top Contributor
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)
 

Julius99

Mitglied
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:

Julius99

Mitglied
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.
 

Julius99

Mitglied
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.
 

Thallius

Top Contributor
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.
 

Julius99

Mitglied
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? :)
 

Julius99

Mitglied
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]
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
U Telepräsenz zwischen Notebook und Roboter Android & Cross-Platform Mobile Apps 1
N Android Informationen zwischen Tabs austauschen Android & Cross-Platform Mobile Apps 2
M Android Kabellose Datenübertragung zwischen zwei Handys - Reichweiten Android & Cross-Platform Mobile Apps 3
? Android erstellen der grafischen Benutzeroberfläche und Kommunikation zwischen Apps Android & Cross-Platform Mobile Apps 8
K Android Datenaustausch zwischen zwei Fragments Android & Cross-Platform Mobile Apps 1
G Android Kommunikation zwischen den Activities Android & Cross-Platform Mobile Apps 1
B Android Kollision zwischen 2 Bitmaps Prüfen? Android & Cross-Platform Mobile Apps 4
R Android Datenaustausch zwischen PC und Handy Android & Cross-Platform Mobile Apps 3
S Android "Weiches wechseln" zwischen Views in einer Activity Android & Cross-Platform Mobile Apps 3
S Android Kommunikation zwischen UI -> Service -> Thread Android & Cross-Platform Mobile Apps 4
M Daten zwischen mehreren Activities Android & Cross-Platform Mobile Apps 2
M Daten zwischen Activities übergeben Android & Cross-Platform Mobile Apps 7
C Android Kommunikation zwischen Service und Activity Android & Cross-Platform Mobile Apps 8
S Android binäre Daten zwischen Android und einem Java-Server Android & Cross-Platform Mobile Apps 5
S Android Auf Funktionen zwischen Activitys zugreifen Android & Cross-Platform Mobile Apps 3
E Übergang zwischen 2 Activities Android & Cross-Platform Mobile Apps 1
G Bluetooth Verbindung zwischen Handy und PC Android & Cross-Platform Mobile Apps 5
T Unterschiede zwischen CrEme 4.1 und J9 6.1 Android & Cross-Platform Mobile Apps 3
O Bluetooth Verbindung zwischen 2 Handys Android & Cross-Platform Mobile Apps 5
T Diskrepanz zwischen SUN Toolkit und NOKIA 6610i Android & Cross-Platform Mobile Apps 3
D messages via xml zwischen server/clienthandy verschicken Android & Cross-Platform Mobile Apps 5
B Zufallszahlen zwischen 1 und 49 erstellen? aber wie? Android & Cross-Platform Mobile Apps 7
N Android Zwei Buttons gleichzeitig drücken Android & Cross-Platform Mobile Apps 9
E Android Zwei Canvase übereinander legen und anzeigen Android & Cross-Platform Mobile Apps 7
M Zwei Android Geräte verbinden Android & Cross-Platform Mobile Apps 7
G zwei Runnable gleichzeitig Android & Cross-Platform Mobile Apps 3
T Zeit in zwei Zahlen für Widget zerlegen Android & Cross-Platform Mobile Apps 2
S Zwei Anfaengerfragen Android & Cross-Platform Mobile Apps 10

Ähnliche Java Themen

Neue Themen


Oben