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
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);
}
}
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.
<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>
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