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.