Apps für Android programmieren leicht gemacht!
GPS Position (Der bessere Weg)

GPS Position (Der bessere Weg)

Bereits vor kurzem haben wir eine Anleitung zum Bestimmung der Position mittels GPS geschrieben.
Leider funktioniert eben dieser Weg nicht auf allen Geräten. Selbst mein Samsung Galaxy S6 hat dort schlapp gemacht. Leider habe ich selber keine Ahnung warum, denn noch vor weniger als 3 Monaten hat der selbe Code bestens funktioniert.

Nun denn, falls der Code nicht funktionieren sollte gibt es immerhin noch einen zweiten Weg. Wir Programmierer wissen uns immer zu helfen 😉

Und zwar können wir versuchen uns die letzte bekannte GPS Position von Android direkt zu holen. Seit neuestem gibt es nämlich eine Google Play services location API.
Mittels derer wir uns einfach und schnell an der GPS Position bedienen können. Diese Daten sollten halbwegs genau sein, um sie verwenden zu können. Vorausgesetzt natürlich die Daten sind aktuell und GPS ist aktiv.

Als erstes müssen wir wieder eine Berechtigung von Android einholen.
Dies erledigen wir, indem wir folgenden Tag in die „AndroidManifest.xml“-Datei einfügen:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

 

Als nächstes wird es etwas kniffliger.
Wir benötigen eine neue Version, des Google Play services. Diese kann man sich über den Android SDK Manager herunterladen. Die Google Play services werden in der Liste ganz unten angezeigt.
Nach dem Herunterladen und der Installation des Google Play services müssen wir eben diesen in unser Projekt einfügen.
Dies erreichen wir, indem wir den SDK Manager wieder schließen. In der linken Liste (in der alle Dateien aufgelistet werden) von Android Studio, klicken wir nun auf den Menüpunkt „Gradle Scripts“ und anschließend auf die Datei „build.gradle (Module: app)“.
Dort fügen wir folgendes in die Klammer von „dependencies“:

dependencies {
    ...
    compile 'com.google.android.gms:play-services-location:7.5.0'
    ...
}

Die Versionsnummer betrug bei mir 7.5.0, dies kann bei euch anders sein. Probiert es einfach aus.

 

Habt ihr es bis hier hin geschafft, dann ist der knifflige Teil auch schon wieder vorüber.
Wir erstellen uns einmal ein Layout, in dem wir unsere GPS Position ausgeben lassen können. Bei  mir sieht das Layout „activity_main.xml“  so aus:

<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.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.0"
        android:id="@+id/textBreitenGrad"
        android:layout_below="@+id/textLaengenGrad"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />


</RelativeLayout>

 

Ab an die Programmierung:

Leider haben wir noch kein einziges Stückchen wirklich programmiert, das soll sich nun ändern.
Aber keine Sorge, die Hälfte haben wir geschafft.

Da wir nun die Google Play services aktualisiert und importiert haben können wir sie nun nutzen.
Dazu fügen wir diese Klassen „GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener“ als implements an unsere Hauptklasse an. Dies könnte so oder so ähnlich aussehen:

public class MainActivity extends Activity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

Nun sollte uns eine Fehlermeldung angezeigt werden.
Kein Grund zu Panik. Android Studio moniert uns lediglich, dass einige Funktionen fehlen. Diese reichen wir bald nach.
Vorerst benötigen wir noch einige Vorkehrungen.
Denn wir benötigen in jedem Fall noch 2 Variablen. Diese Definieren wir innerhalb unserer Klasse:

//Mit Hilfe dieser können wir später die Position auslesen    
GoogleApiClient mGoogleApiClient;

//Diese Variable beinhaltet später die Positionsdaten
Location mLastLocation;

//Variablen, zur Anzeige der Daten (nicht unbedingt relevant)
TextView l;
TextView b;

 

Der nächste Schritt der nun nötig ist, ist die Initialisierung des Google Play services und das hinzufügen, der von Android Studio monierten Funktionen.

//Wird beim Start der App aufgerufen
 @Override
 protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);

     //Aufruf der Initalisierung
     buildGoogleApiClient();

     //Definieren der Textausgabefelder
     l = (TextView) findViewById(R.id.textLaengenGrad);
     b = (TextView) findViewById(R.id.textBreitenGrad);

     //Starten der eben initalisierten API von Google
     mGoogleApiClient.connect();
 }

 //Initalisiert die API von Google, mit der wir die Position auslesen können
 protected synchronized void buildGoogleApiClient() {
     mGoogleApiClient = new GoogleApiClient.Builder(this)
             .addConnectionCallbacks(this)
             .addOnConnectionFailedListener(this)
             .addApi(LocationServices.API)
             .build();
 }

 //Wird aufgerufen, wenn die Verbindung zur Google API aussteht
 @Override
 public void onConnectionSuspended(int i) {}

 //Wird aufgerufen, wenn die Verbindung zur Google API fehlschlägt
 @Override
 public void onConnectionFailed(ConnectionResult connectionResult) {
     l.setText("Längengrad: Da ist ein Fehler aufgetreten.");
     b.setText("Breitengrad: Da ist ein Fehler aufgetreten.");
 }

 

Letztendlich wird über folgende Funktion die GPS Position empfangen und ausgelesen.
Sie wird von der App eigenständig ausgeführt, sobald eine erfolgreiche Verbindung zu den Google Play services hergestellt wurde.

//Wird aufgerufen, wenn die Verbindung zur Google API erfolgreich ist
@Override
public void onConnected(Bundle connectionHint) {
    //Anhand der erfolgreichen Verbindung die benötigten Daten auslesen
    mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);

    if (mLastLocation != null) {
        //Die ausgelesenen daten verwerten und anzeigen
        l.setText("Längengrad: " + String.valueOf(mLastLocation.getLongitude()));
        b.setText("Breitengrad: " + String.valueOf(mLastLocation.getLatitude()));
    }
}

GPS Position Source Code


Download dir kostenfrei den Source Code zu diesem Artikel und bestimme mittels einer Google API die GPS Position.

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.

6 Kommentare

*Pflichtfeld

  • Hallo Julian,

    die Aktualität der Daten findest du über den Aufruf „mLastLocation.getTime()“.

    Wie oft der Standort genommen werden soll, definierst du über folgenden Code:

    LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
    mLocationRequest = LocationRequest.create().setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY).setInterval(60000).setFastestInterval(30000);
    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);

    Er aktualisiert dann alle 30 Sekunden bis 60 Sekunden den Standort.
    Es kann allerdings etwas dauern, bis der neue Standort ankommt. Versuche also den Code frühzeitig zu starten.

    Gruß

  • Hallo. Erst einmal möchte ich diese klar Verständliche Anleitung loben!
    Ich stoße derzeit aber auf das Problem, dass ich im checkSelfPermission stecken bleibe, bevor ich die TextViews befüllen kann.. Kannst du mir da weiterhelfen?

    Vielen Dank schon einmal im Voraus!

      • Die beiden Artikel haben mir super weitergeholfen. Danke dafür!

        Bei mir ist eine neue Frage aufgekommen.. wie trenne ich die GPS-Verbindung wieder? Ich möchte nur alle 5 Minuten checken, wo ich mich befinde, die GPS-Verbindung wieder trennen und dann mit einem API-Aufruf noch Daten aus dem Netz ziehen. Das alles läuft bei mir über einen AlarmManager und BroadcastReceiver.

        Danke schon einmal und viele Grüße,
        Tom

      • Hallo Tom,
        Du kannst die GPS-verbindung an sich selber nicht trennen, aber du kannst die Verbindung zur Google API trennen.
        Einfach nach Erhalt der Daten den Befehl „mGoogleApiClient.disconnect();“ benutzen.
        Natürlich erst nachdem du die GPS-Daten in der Funktion „onConnected“ ausgelesen hattest und die GPS-daten vielleicht noch irgendwie an einen Server hochgeladen/geschickt hast oder was du auch immer machen möchtest.

        Gruß