Android Location API - Simple Location: Unterschied zwischen den Versionen

Aus Wikizone
Wechseln zu: Navigation, Suche
Zeile 74: Zeile 74:
  
 
</LinearLayout>
 
</LinearLayout>
 +
</pre>
 +
 +
== ShowLocation Activity programmieren ==
 +
1. Einen LocationListener implementieren
 +
import android.location.LocationListener;
 +
...
 +
public class ShowLocationActivity extends Activity''' implements LocationListener'''  {
 +
...
 +
Eclipse zeigt daß wir für das Interface diverse Funktionen brauchen:
 +
 +
<pre>
 +
@Override
 +
public void onLocationChanged(Location arg0) {
 +
// TODO Auto-generated method stub
 +
 +
}
 +
 +
@Override
 +
public void onProviderDisabled(String arg0) {
 +
// TODO Auto-generated method stub
 +
 +
}
 +
 +
@Override
 +
public void onProviderEnabled(String arg0) {
 +
// TODO Auto-generated method stub
 +
 +
}
 +
 +
@Override
 +
public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
 +
// TODO Auto-generated method stub
 +
 +
}
 +
 +
</pre>
 +
 +
Dann verdrahten wir die Textfelder des Layouts mit dem Code...
 +
<pre>
 +
public class ShowLocationActivity extends Activity implements LocationListener{
 +
private TextView latitudeField;
 +
private TextView longitudeField;
 +
private LocationManager locationManager;
 +
private String provider;
 +
...
 +
 +
// activity is created...
 +
@Override
 +
protected void onCreate(Bundle savedInstanceState) {
 +
super.onCreate(savedInstanceState);
 +
setContentView(R.layout.activity_show_location);
 +
latitudeField = (TextView) findViewById(R.id.TextView02);
 +
longitudeField = (TextView) findViewById(R.id.TextView04);
 +
...
 +
</pre>
 +
 +
bei den Textviews haben wir auch schon einen LocationManager definiert und einen String, der den gewählten Provider speichern wird (gps oder network). Auch dieser wird in onCreate instanziiert:
 +
 +
LocationManager Service holen
 +
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
 +
Ein Criteria Objekt erstellen daß unsere Bedingungen an den Service enthält. Da wir nichts setzen sind es hier Standardbedingungen.
 +
Criteria criteria = new Criteria();
 +
Wir Fragen den Location Manager welches der beste Provider für unsere Kriterien sind (false -> auch wenn diese abgeschaltet sind).
 +
provider = locationManager.getBestProvider(criteria, false);
 +
Welches war die letzte bekannte Position ? Diese wir in ein Location Objekt gespeichert.
 +
Location location = locationManager.getLastKnownLocation(provider);
 +
Wenn wir was haben schreiben wir es in die Textfelder.
 +
<pre>
 +
if(location != null){
 +
System.out.println("Provider " + provider + "has been selected.");
 +
onLocationChanged(location);
 +
}else{
 +
tvLatitude.setText("Location is not available");
 +
tvLongitude.setText("Location is not available");
 +
}
 +
</pre>
 +
 +
Wenn die Activity startet (oder resumed wird) soll der LocationManager regelmäßig Updates über den gewählten provider liefern. Es sollen aber mindestens 600ms und 10m zwischen den Updates liegen. Damit wir dann auch etwas übernehmen können wird im letzten Parameter ein locationManager übergeben dessen onLocationChanged Methode aufgerufen werden soll. In diesem Fall übergeben wir ihn sich selbst.
 +
<pre>
 +
/* Request updates at startup */
 +
@Override
 +
protected void onResume() {
 +
  super.onResume();
 +
  locationManager.requestLocationUpdates(provider, 600, 10, this);
 +
}
 +
</pre>
 +
 +
Wenn die Activity pausiert sollen auch die Updates pausieren
 +
<pre>
 +
/* locationlistener updates stoppen wenn Activity pausiert sonst gibt es Fehler im Log */
 +
@Override
 +
protected void onPause() {
 +
super.onPause();
 +
locationManager.removeUpdates(this);
 +
}
 
</pre>
 
</pre>

Version vom 7. Oktober 2013, 16:16 Uhr

Einleitung

Projekt

1. Android Projekt erstellen Name: Simple Location

Permissions

Zum manifest.xml hinzufügen:

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

Layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="40dip"
        android:orientation="horizontal" >

        <TextView
            android:id="@+id/TextView01"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dip"
            android:layout_marginRight="5dip"
            android:text="Latitude: "
            android:textSize="20dip" >
        </TextView>

        <TextView
            android:id="@+id/TextView02"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="unknown"
            android:textSize="20dip" >
        </TextView>
    </LinearLayout>

    <LinearLayout
        android:id="@+id/linearLayout2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/TextView03"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dip"
            android:layout_marginRight="5dip"
            android:text="Longitute: "
            android:textSize="20dip" >
        </TextView>

        <TextView
            android:id="@+id/TextView04"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="unknown"
            android:textSize="20dip" >
        </TextView>
    </LinearLayout>

</LinearLayout>

ShowLocation Activity programmieren

1. Einen LocationListener implementieren

import android.location.LocationListener;
...
public class ShowLocationActivity extends Activity implements LocationListener  {
...

Eclipse zeigt daß wir für das Interface diverse Funktionen brauchen:

	@Override
	public void onLocationChanged(Location arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void onProviderDisabled(String arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void onProviderEnabled(String arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
		// TODO Auto-generated method stub
		
	}

Dann verdrahten wir die Textfelder des Layouts mit dem Code...

public class ShowLocationActivity extends Activity implements LocationListener{
	private TextView latitudeField;
	private TextView longitudeField;
	private LocationManager locationManager;
	private String provider;
...

	// activity is created...
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_show_location);
		latitudeField = (TextView) findViewById(R.id.TextView02);
		longitudeField = (TextView) findViewById(R.id.TextView04);
...

bei den Textviews haben wir auch schon einen LocationManager definiert und einen String, der den gewählten Provider speichern wird (gps oder network). Auch dieser wird in onCreate instanziiert:

LocationManager Service holen

locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

Ein Criteria Objekt erstellen daß unsere Bedingungen an den Service enthält. Da wir nichts setzen sind es hier Standardbedingungen.

Criteria criteria = new Criteria();

Wir Fragen den Location Manager welches der beste Provider für unsere Kriterien sind (false -> auch wenn diese abgeschaltet sind).

provider = locationManager.getBestProvider(criteria, false);

Welches war die letzte bekannte Position ? Diese wir in ein Location Objekt gespeichert.

Location location = locationManager.getLastKnownLocation(provider);

Wenn wir was haben schreiben wir es in die Textfelder.

if(location != null){
	System.out.println("Provider " + provider + "has been selected.");
	onLocationChanged(location);
}else{
	tvLatitude.setText("Location is not available");
	tvLongitude.setText("Location is not available");
}

Wenn die Activity startet (oder resumed wird) soll der LocationManager regelmäßig Updates über den gewählten provider liefern. Es sollen aber mindestens 600ms und 10m zwischen den Updates liegen. Damit wir dann auch etwas übernehmen können wird im letzten Parameter ein locationManager übergeben dessen onLocationChanged Methode aufgerufen werden soll. In diesem Fall übergeben wir ihn sich selbst.

	/* Request updates at startup */
	@Override
	protected void onResume() {
	  super.onResume();
	  locationManager.requestLocationUpdates(provider, 600, 10, this);
	}

Wenn die Activity pausiert sollen auch die Updates pausieren

	/* locationlistener updates stoppen wenn Activity pausiert sonst gibt es Fehler im Log */
	@Override
	protected void onPause() {
		super.onPause();
		locationManager.removeUpdates(this);
	}