Home Navigationspfeil Android Navigationspfeil GPS verwenden

Android GPS Beispiel

Aus irgendeinem Grund scheint es kein einfaches Beispiel zu geben das genau zeigt wie das GPS auf Android Geräten benutzt wird. Deshalb habe ich mich hingesetzt und den Code aus einem meiner Projekte zu einem Beispiel zusammen gefasst. Der hier gezeigte Code lauscht auf die Veränderungen der Position und zeigt einige Daten des GPS in einer TextView an. Das Beispiel beschreibt weiterhin die Möglichkeit, die GPS Einstellungen aus einer APP heraus zu verändern. Dazu wird über ein Intent die Einstellung für das GPS geöffnet, dies ist in manchen Fällen nötig, da der Anwender das GPS ausgeschaltet hat um z.B. den Akku zu schonen.

Code

package de.bollwerkessen.android.examples.gps;

import android.app.Activity;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity implements LocationListener {

        final String TAG = "GPSExample";
        TextView txtInfo;
        LocationManager lm;
        StringBuilder sb;
        int noOfFixes = 0;

        /*
         * Diese Klasse implementiert einen Locationlistener, der Änderungen der
         * Position des Geräts und den Status des GPS-Systems überwacht.
         */


        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);

                /* Textview erstellen, um die GPS-Daten anzuzeigen */
                txtInfo = (TextView) findViewById(R.id.textGPSInfo);

                /*
                 * der LocationManager ist der wichtigste Teil er ermöglicht den Zugriff
                 * auf die Standortdaten und GPS-Status
                 */

                lm = (LocationManager) getSystemService(LOCATION_SERVICE);
        }

        @Override      
        protected void onResume() {

                /*
                 * onResume wird immer nach onStart aufgerufen, auch wenn die App nicht
                 * angehalten wurde.
                 *
                 * Hinzufügen des LocationListener und so einstellen das
                 * Aktualisierungen alle 1000ms bzw. bei Änderung der Position um 10m
                 * durchgeführt werden.
                 */

                lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 10f, this);
                super.onResume();

        }

        @Override
        protected void onPause() {

                /*
                 * Wie sich gezeigt hat, verbraucht das GPS Strom wie verrückt, somit
                 * ist der Akku wirklich sehr schnell am Ende. Aus diesem Grund wird
                 * hier das GPS ausgeschaltet.
                 */

                lm.removeUpdates(this);
                super.onPause();

        }

        @Override
        protected void onStop() {

                /*
                 * Die Anwendung kann hier einfach beendet werden, da eine Sicherung des
                 * Zustands für diese Beispiel-Anwendung nicht nötig ist.
                 */

                finish();
                super.onStop();

        }
       
        /*
         * (non-Javadoc)
         *
         * @see
         * android.location.LocationListener#onLocationChanged(android.location.
         * Location)
         */

        @Override
        public void onLocationChanged(Location location) {
               
                Log.v(TAG, "Position geändert");

                sb = new StringBuilder(512);

                noOfFixes++;

                /* Anzeigen einiger GPS-Daten in der Textview */

                sb.append("Anzahl der Sat-Fixe: ");
                sb.append(noOfFixes);
                sb.append('\n');
                sb.append('\n');

                sb.append("geo. Länge: ");
                sb.append(location.getLongitude());
                sb.append('\n');

                sb.append("geo. Breite: ");
                sb.append(location.getLatitude());
                sb.append('\n');

                sb.append("Höhe: ");
                sb.append(location.getAltitude());
                sb.append('\n');

                sb.append("Genauigkeit: ");
                sb.append(location.getAccuracy());
                sb.append('\n');

                sb.append("Zeitstempel: ");
                sb.append(location.getTime());
                sb.append('\n');

                txtGPSInfo.setText(sb.toString());

        }

        /*
         * (non-Javadoc)
         *
         * @see android.location.LocationListener#onStatusChanged(java.lang.String,
         * int, android.os.Bundle)
         */

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

                /*
                 * Diese Methode wird immer dann aufgerufen, wenn sich der GPS-Status
                 * verändert
                 */

                switch (status) {
                case LocationProvider.OUT_OF_SERVICE:
                        Log.v(TAG, "Statusänderung: Außer Betrieb");
                        Toast.makeText(this, "Statusänderung: Außer Betrieb",
                                        Toast.LENGTH_SHORT).show();
                        break;
                case LocationProvider.TEMPORARILY_UNAVAILABLE:
                        Log.v(TAG, "Statusänderung: vorübergehend nicht verfügbar");
                        Toast.makeText(this, "Statusänderung: vorübergehend nicht verfügbar",
                                        Toast.LENGTH_SHORT).show();
                        break;
                case LocationProvider.AVAILABLE:
                        Log.v(TAG, "Statusänderung: GPS Verfügbar");
                        Toast.makeText(this, "Statusänderung: GPS Verfügbar",
                                        Toast.LENGTH_SHORT).show();
                        break;
                }

        }

        /*
         * (non-Javadoc)
         *
         * @see
         * android.location.LocationListener#onProviderEnabled(java.lang.String)
         */

        @Override
        public void onProviderEnabled(String provider) {

                Log.v(TAG, "Aktiviert");
                Toast.makeText(this, "GPS Aktiviert", Toast.LENGTH_SHORT).show();

        }

        /*
         * (non-Javadoc)
         *
         * @see
         * android.location.LocationListener#onProviderDisabled(java.lang.String)
         */

        @Override
        public void onProviderDisabled(String provider) {

                /*
                 * Diese Methode wird aufgerufen wenn/falls das GPS in den Einstellungen
                 * deaktiviert ist.
                 */

                Log.v(TAG, "Deaktiviert");

                /* Aufrufen der GPS-Einstellungen */
                Intent intent = new Intent(
                                android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                startActivity(intent);

        }

}
 
MainActivity.java

Berechtigungen

Selbstverständlich verwendet das Android-Framework eine Berechtigung für die Nutzung des GPS, um den Benutzer zu schützen. Um diese Erlaubnis zu erhalten, fügen Sie einen "uses-permission" Eintrag mit dem Namen "android.permission.ACCESS_FINE_LOCATION" in der AndroidManifest.xml Datei hinzu.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="de.bollwerkessen.android.examples.gps"
   android:versionCode="1"
   android:versionName="1.0" >

    <uses-sdk
       android:minSdkVersion="8"
       android:targetSdkVersion="21" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

    <application
       android:allowBackup="true"
       android:icon="@drawable/ic_launcher"
       android:label="@string/app_name"
       android:theme="@style/AppTheme" >
        <activity
           android:name=".MainActivity"
           android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
 
AndroidManifest.xml

Hinweis

Beim testen des Codes im Emulator können Sie simulierte Koordinaten/Fixes verwenden. Dazu stellen Sie eine Telnet-Verbindung zum Emulator her

 frank@saturn:~$ telnet localhost 5554 

wenn sich der Emulator gemeldet hat kann nun wie unten zu sehen eine Position an den Emulator gesendet werden, z.B. die Koordinaten von Berlin.

 Android Console: type 'help' for a list of commands
 OK
 geo fix 13.408333, 52.518611