Apps für Android programmieren leicht gemacht!
GPS Position

GPS Position

Viele Apps nutzen die GPS Koordinaten, um die genaue Position des Smartphones zu bestimmen. Wir möchten uns in diesem Artikel der Bestimmung der GPS Position widmen.
GPS ist die Abkürzung für Global Positioning System und heißt zu deutsch etwa Globales Positionsbestimmungssystem. GPS wurde am 17. Juli 1995 offiziell in Betrieb genommen. [Quelle]

Mit Hilfe mindestens dreier GPS Satelliten kann die genaue Position (bis auf ein paar Meter genau) bestimmt werden. Somit können Längen- und Breitengrade des Aufenthaltsortes bestimmt werden. Mit Hilfe eines kleinen Java Codes können wir eben diese Längen- und Breitengrade in Android auslesen und verwerten.
Aber Achtung: Eine Bestimmung der GPS Position ist nur möglich, wenn der Anwender GPS in seinem Smartphone aktiviert hat!

 

GPS Position bestimmen:

Fangen wir nun an zu programmieren.
Wir benötigen als aller erstes einmal die Berechtigung in unserer App die GPS Funktion nutzen zu dürfen.
Diese holen wir uns über folgende Tags innerhalb der Datei „AndroidManifest.xml“ ein:

<!--Bestimmung der genauen Position-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Über die Berechtigung der genaue Position werden ebenfalls Daten wie die Namen der W-Lan Netzwerke, in der Nähe, und das Telefonnetz einbezogen. Durch diese zusätzlichen Daten ist eine genauere Bestimmt der Position möglich. Wir nutzen in diesem Artikel dennoch ausschließlich die GPS Funktion.

Nachdem wir nun unsere Berechtigungen von Android bekommen haben benötigen wir eine Klasse, die die GPS Position bestimmen und zurückgeben kann.
Dazu erstellen wir eine neue Klasse Namens „GPSBestimmung“ und schreiben folgendes hinein:

public class GPSBestimmung extends Service implements LocationListener {

    private final Context c;

    public GPSBestimmung(Context context) {
        this.c = context;
    }

    @Override
    public void onProviderDisabled(String provider) {
    }

    @Override
    public void onProviderEnabled(String provider) {
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }

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

Damit haben wir unser Grundgerüst. Alle zu überschreibenden Funktionen sind überschrieben. Alle folgenden Funktionen sind für uns erst wirklich von Belang.

Da wir gerne möchten, dass uns die Klasse „GPSBestimmung“ etwas ausgibt, benötigen wir Variablen. Wir können Längengrade und Breitengrade ausgeben und zurückgeben, ob die Positionsbestimmung möglich ist.
Diese Variablen mit in die Klasse „GPSBestimmung“ schreiben:

//Variable, zum speichern, ob GPS aktiv ist
private boolean GPSaktiv = false;

//Die Variable Location wird später benötigt und beinhaltet den Längen- und Breitengrad
Location position;

//Die Variable LocationManager wird später benötigt und ermöglicht die Positionsbestimmung
protected LocationManager locationManager;

 

Anschließend benötigen wir Funktionen, die uns diese Daten ausgeben können:

//Gibt den Breitengrad als Double zurück
public double getBreitengrad(){
    if (position != null){
        return position.getLatitude();
    }else{
        return 0;
    }
}

//Gibt den Längengrad als double zurück
public double getLaengengrad(){
    if(position != null){
        return position.getLongitude();
    }else{
        return 0;
    }
}

//Gibt zurück, ob GPS eingeschaltet ist (true oder false)
public boolean istGPSaktiv() {
    return this.GPSaktiv;
}

 

Um die Variable „Position“ zu beschreiben benötigen wir folgende Funktion:

public void setPosition() {
    try {
        locationManager = (LocationManager) c.getSystemService(LOCATION_SERVICE);

        //ließt den GPS Status aus (Aktiv = Ja/Nein)
        GPSaktiv = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);

        if (GPSaktiv) {
            //Bestimmung der GPS Position, sofern GPS eingeschaltet ist. Die daten werden in der Variable "position" gespeichert.
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 60000, 10, this);
            if (locationManager != null) {
                position = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

 

Zu guter letzt können wir noch ein kleinen wenig Schnickschnack einfügen. (Erklärung folgt gleich)

@Override
public void onLocationChanged(Location location) {
    position = location;
}

//Beendet GPS Bestimmung
public void stopGPSposition(){
    if(locationManager != null){
        locationManager.removeUpdates(GPSBestimmung.this);
    }
}

 

Erklärung:

Die Funktionsweise unserer Klasse „GPSBestimmung“ ist folgendermaßen geregelt.
Beim Aufruf der Klasse wird diese mit samt ihren Variablen initialisiert.
Anschließend kann man die Funktion „setPosition“ aufrufen. Diese Funktion bestimmt die momentane Position, sofern GPS aktiv ist, und schreibt alles in unsere Variablen nieder.
Gleichwohl wird in der Funktion „setPosition“ auch ein Updateintervall festgelegt. Dieser Updateintervall liegt bei 10 Metern oder 60 Sekunden (in Millisekunden angegeben).
Wird dieser Intervall erreicht wird die Funktion „onLocationChanged“ angesprochen. Die Funktion „onLocationChanged“ beschreibt dann die neue Position in der Variable „position“ nieder und  somit können wir alle 10 Meter oder alle 60 Sekunden die aktuelle Position zurückgegeben bekommen.
Mit der Funktion „stopGPSposition“ können wir diesen Updateintervall abschalten und somit Akku sparen.
Auslesen können wir, ab dem Aufruf der Funktion „setPosition“ die Längen- und Breitengrade mit den Funktionen „getLaengengrad“ und „getBreitengrad“.

 

Nutzung:

Möchten wir die Klasse „GPSBestimmung“ nun in Aktion erleben können wir dies über folgenden Code:

package de.droid_lernen.gpsposition;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;


public class MainActivity extends Activity {

    GPSBestimmung GPS;
    TextView l;
    TextView b;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        GPS = new GPSBestimmung(this);
        GPS.setPosition();

        l = (TextView) findViewById(R.id.textLaengenGrad);
        b = (TextView) findViewById(R.id.textBreitenGrad);

        if(GPS.istGPSaktiv() == true){
            //GPS ist aktiv, Grade ausgeben
            l.setText("Längengrad: " + GPS.getLaengengrad());
            b.setText("Breitengrad: " + GPS.getBreitengrad());
        }
    }

}

Wenn unsere Datei activity_main.xml folgendermaßen aussieht:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <TextView android:text="@string/hello_world" android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/textView" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Längengrad: 0"
        android:id="@+id/textLaengenGrad"
        android:layout_below="@+id/textView"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Breitengrad: 0"
        android:id="@+id/textBreitenGrad"
        android:layout_below="@+id/textLaengenGrad"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />


</RelativeLayout>

GPS Position Source Code


Lade dir den kompletten Source Code zu diesem Artikel herunter. Bestimme ganz einfach die GPS Position deines Android Smartphones.

DownloadLizenzbedingungen

Marvin

Ich bin 23 Jahre jung und studiere zurzeit Wirtschaftsinformatik an der Georg-August-Universität in Göttingen. Ich bin ein Mensch, der sich neben der Programmierung noch für tausend andere Dinge interessiert, die mal mehr und mal weniger verrückt sind. Vor allem aber bin ich Feuer und Flamme mit der Programmierung von eigenen kleinen Apps und Programmen, die mein Leben bereichern.

4 Kommentare

*Pflichtfeld

  • Hallo Marvin,

    ich habe mir dein Demo mal genommen.
    Leider wird in der Activity nur einmal die LastKnownLocation Position angezeigt.
    In der GPSBestimmung.java gibt es den Befehl onLocationChanged. DAmit werden auch die neuen Locations in die Variable Position geschrieben. Diese neuen Loctaion kommen aber nicht in der Aktivity an. Die Textfelder werden nicht neu beschrieben.

    Wie kann man die Felder überschreiben?

    Gruß
    Andreas

    • Hallo Andreas,

      in der Demo ist eine Aktualisierung der TextViews mit den neuen Locations nicht vorgesehen.
      Du könntest einfach einen Button erstellen, der sich erneut die Position per Funktion getLatitude und getLongitude holt oder aber einen Timer setzen, der dies macht.

      Wie man einen Timer benutzt findest du in diesem Artikel: https://droid-lernen.de/performance-verbessern/
      Unter dem Kapitel: Timer statt Schleifen

      Gruß,
      Marvin

  • Hallo Marvin
    funktioniert Dein Beispiel noch. Der erste Test mit dem Quellcode von Dir war leider nicht erfolgreich.
    Anschließend habe ich die beschriebenen Punkte in ein neues Projekt eingebaut.
    Leider auch ohne Erfolg.
    Ab hier
    GPSaktiv = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    stürz die App mit Meldung
    Unfortunately, My Application_6 has stopped

    Ich bin noch am Anfang mit der App Entwicklung und bin etwas überfragt.
    Ich muss mich erst richtig rein finden in die Thematik.

    Hast Du da noch eine Idee dazu.

    LG
    Stefan