Využití vestavěné technologie GPS

Na závěr si ukážeme použití API pro ovládání GPS přijímače. Vzhledem k tomu, že však s největší pravděpodobností pracujete na emulátoru, budeme muset jako všechno ostatní, i GPS simulovat.

Vytvoříme aplikaci, která bude implementovat LocationListener a bude reagovat na změnu polohy zaznamenané dle GPS, kterou bude následně vypisovat na obrazovku.

Nejprve si připravíme layout - můžeme použít základní layout vytvořený při zakládání nové aplikace a pouze připíšeme ID (label1) k textovému prvku, abychom ho v programu jednoduše našli:

<?xml version="1.0" encoding="utf-8"?>
  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
    <TextView
      android:id="@+id/label1"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:text="@string/hello" />
  </LinearLayout>

Nyní přichází na řadu kód, který si vysvětlíme níže:

package cz.cvut.fel.android;

import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.TextView;

public class GPSLocationTest extends Activity implements LocationListener
{
  private LocationManager lm;

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState)
  {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.main);

	lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
	lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1l, 1l, this);
  }

  @Override
  public void onLocationChanged(Location arg0)
  {
	String lat = String.valueOf(arg0.getLatitude());
	String lon = String.valueOf(arg0.getLongitude());
	TextView gpsText = (TextView) findViewById(R.id.label1);
    gpsText.setText("location changed:\nlongitude = " + lon + "\nlatitude = " + lat);
  }

  @Override
  public void onProviderDisabled(String arg0) {}

  @Override
  public void onProviderEnabled(String arg0) {}

  @Override
  public void onStatusChanged(String arg0, int arg1, Bundle arg2) {}
}

Naše aktivita tedy implementuje LocationListener resp. jeho metody, z nichž nejdůležitější pro naši aplikaci je void onLocationChanged(Location arg0). Ostatní metody v našem případě nic nedělají.

Na řádku 22 si vytvoříme objekt třídy LocationManager, jehož metodou na řádku 23 přiřadíme v podstatě listener naší třídy (již zmíněnou metodu onLocationChanged), který se zavolá při změně GPS polohy telefonu.

V této metodě pak už jen získáme zeměpisnou šířku a délku a vše vypíšeme do TextView.

POZOR! Pokud byste však tento kód spustili, aplikace vyhodí bezpečnostní výjimku, v konfiguračním XML souboru jsme totiž nenastavili příslušná oprávnění, musíme to tedy napravit. Do souboru AndroidManifest.xml přidámě těsně před značku </manifest> tyto řádky:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
<uses-permission android:name="android.permission.CONTROL_LOCATION_UPDATES"/>

Teď už můžeme aplikaci spustit. S největší pravděpodobností se ale nic nestane, protože - logicky - jsme nezměnili polohu telefonu. Jak jsem zmínil na začátku, toto musíme simulovat. Na stránce http://developer.android.com/guide/developing/tools/emulator.html resp. http://developer.android.com/guide/developing/tools/emulator.html#geo se dozvíte jak na to.

Stačí spustit příkaz telnet localhost 5554, kde 5554 je port, na kterém běží Android emulátor (naleznete ho v titulku okna emulátoru). v Telnetu pak napište příkaz:

geo fix <longitude> <latitude> , tedy např.:
geo fix 15 50

Po odeslání by se měla ve spuštěné aplikaci tato zeměpisná poloha objevit.