GPS ungenau, wenn es denn geht!

  • 10 Antworten
  • Neuester Beitrag
Diskutiere GPS ungenau, wenn es denn geht! im Android App Entwicklung im Bereich Betriebssysteme & Apps.
W

washpuda

Neues Mitglied
Hallo,
ich entwickle aktuell eine App für das Melden von Illegalen Müllablagerungen im Landkreis Oberhavel "Waldputz OHV" die bereits auch im Play-Store geladen werden kann. Mit der Programmierung selbst komme ich sehr gut klar, lediglich die Erfassung der Position mittels GPS macht mir reichlich Probleme. Das aktvieren von GPS und das freischalten der Berechtigung ist einfach und funktioniert. Lediglich das erfassen der Position ist sehr schwierig, denn meistens (Geräteabhängig) bekommt man kein Empfang oder eine Position wo man vor ein paar Tagen war. Wenn man kurz Google Maps aktiviert, ist die Position danach oftmals richtig.

Ich verwende aktuell noch (wobei ich schon vieles versucht habe)

Code:
if (locationManager != null) {
    location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
    if (location == null) {
        location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
    }
}


oftmals erhält man hier null oder eine fasche Position. Ich habe mich auch schon mit implementation "com.google.android.gms:play-services-location:17.1.0"
auseinander gesetzt. Ich habe schon viel im Internet gelesen. Viele Dinge sind jedoch auch teilweise schon veraltet.

Ich benötige einfach nur eine Funktion, die mir die aktuelle Position zurückgibt, ideal mit einer Ungenauigkeit, damit ich abschätzen kann, ob der Wert Ok ist. Google Maps bekommt das ja auch hin, also kann es nicht an der Hardware liegen, was machen die anders? Ich hoffe mich kann jemand den richtigen Weg führen.
 
nik

nik

Senior-Moderator
Teammitglied
Wieso nimmst du statt getlastknownlocation nicht getcurrentlocation?
 
W

washpuda

Neues Mitglied
Hallo nik,
die Methode locationManager.getCurrentLocation() gibt es nicht? Verwendest du hier einen anderen LocationManager oder ein andere Object.
 
nik

nik

Senior-Moderator
Teammitglied
Ich bin kein App-Programmierer und hab jetzt nur schnell in die Docs geschaut, weil ich getlastknownlocation schon allein von der Namensgebung nicht passend fand.
 
swa00

swa00

Moderator
Teammitglied
Zuletzt bearbeitet:
W

washpuda

Neues Mitglied
Hallo swa00,

nein einen Listener werte ich nicht aus. Würde ja auch bedeuten, das ich eine Anfrage erstelle und irgendwann die Position herhalte. Ein kurzer Augenblick wäre mit Sicherheit erträglich aber wenn es zu lange dauert? Hast du hier vielleicht ein guten Link? Hab hier schon einiges gelesen. Ob es funktioniert weiß man erst immer erst sehr spät, denn die Methode
getLastKnownLocation() liefert beim Programmieren auch gute Ergebnisse, nur eben in der Praxis nicht.

Ich erstelle ja mit der Kamera ein Foto und Frage die Position erst ab, wenn das Foto bestätigt ist. Ggf. kann ich die Aktualisierung und Ermittlung der GPS bereits beim Starten der Kamera aktivieren.
 
swa00

swa00

Moderator
Teammitglied
Nein, du verstehst die Technik noch nicht vollständig.

Die Google.Services ermitteln dir die Position und schicken Dir erst dann mittels Listener das Ergebnis, wenn es Korrekt resp.
verfügbar ist. Du kannst nicht aktiv abfragen - erst recht nicht , wenn noch kein FIX existiert.
Entweder du wartest wirklich , bis der Listener dir was geschickt hat , oder du baust dir einen Service , der wiederum
den LocationListener bedient.

getLastKnowLocation ist lediglich ein Puffer, der dir nur die letzte gepufferte Location zurückgibt, bei der ein FIX
von mindestens 4 Satelitten existierte und der NMEA Datensatz gültig war. - oder schlichtweg ungültig.

Hat aber rein gar nichts mit der aktuellen Position zu tun - mit einem Fahrzeug kannst du kilometerweit davon entfernt sein.

Ob es funktioniert weiß man erst immer erst sehr spät, denn die Methode
getLastKnownLocation() liefert beim Programmieren auch gute Ergebnisse, nur eben in der Praxis nicht.
Klar, du sitzt ja immer am gleichen Schreibtisch - und programmierst ja nicht im fahrenden Zug :)

Ob es funktioniert weiß man erst immer erst sehr spät,
Nein , am Schreibtisch bewegst du dich nicht und erhälst dadurch auch keine Änderungen.
Ausprobiert hast du es noch nicht , oder ?

Abgesehen davon, ist bei einer Positionsänderung der Listener sehr schnell, der Interval sollte aber nicht unter 2 Sekunden
gesetzt sein, denn dann bekommst du einen unnötigen Drain. 2 Sekunden bedeutet eh dann min. eine Geschwindigkeit von 100 km/h.
 
Zuletzt bearbeitet:
W

washpuda

Neues Mitglied
Hallo swa00,

danke, das mit dem Listener ist ein guter Hinweis, das schaue ich mir mal an. Wäre das hier der richtige Ansatz?

Code:
mFusedLocationClient.getLastLocation().addOnSuccessListener(new OnSuccessListener<Location>() {
@Override
    public void onSuccess(Location location) {
        // GPS location can be null if GPS is switched off
        if (location != null) {
            Utils.log("new Funtion " + location);
        }
    }
})

Im Netz gibt es viele Beispiele für GPS, aber eben auch wenn Sie nicht so gut funktionieren.
 
swa00

swa00

Moderator
Teammitglied
Im Netz gibt es viele Beispiele für GPS, aber eben auch wenn Sie nicht so gut funktionieren.
Deshalb IMMER nach der Originalen API Doku schauen und diese vollständig durchlesen.
Und wenn du mal ein Beispiel gefunden hast ( z.b. StackOverflow ) - achte auf das Datum- 99,9% sind deprecated.


Beispiele aus dem Netz sind nur dann wertvoll, wenn man vorher die API Doku verstanden hat - nicht umgekehrt
 
Zuletzt bearbeitet:
W

washpuda

Neues Mitglied
Danke für den Tipp, manche Beispiele sind aber auch gut.