Tillbaka till lektionslistan

Mobila applikationer med Android: Lektion 7

Idag: Location-API:et och programmet "Simple GPS Test"

Klicka på startknappen i den lilla mediaspelaren ovan för att lyssna på lektionen. (Man kan behöva vänta en stund på att ljudfilen laddas ner.) Om mediaspelaren inte syns, eller om det inte fungerar av något annat skäl, kan man klicka här för att ladda ner mp3-filen (ca 12 minuter, ca 6 megabyte). Beroende på hur webbläsaren är konfigurerad kan det kräva ett separat mp3-spelarprogram av något slag.

Tillägg 16 februari 2017:
  • I den här lektionen används en äldre version av Android, och den gamla utvecklingsmiljön, Eclipse. Här finns en modernare version av programmet SimpleGPSTest, för Android Studio: SimpleGPSTest.zip (APK-fil: SimpleGPSTest.apk).
  • Numera finns det två helt olika sätt att få fram sin geografiska position i Android: dels det sätt som beskrivs här, där man explicit hämtar positionen från GPS:en eller från nätverket, och dels det mer avancerade Google Location Services API, som är en del av Google Play Services. Man kan läsa mer på Googles Android-webbplats: Location Strategies och Making Your App Location-Aware
  • Android utvecklas och ändras snabbt, och för mer information och aktuella instruktioner bör man alltid läsa på Googles Android-webbplats: developer.android.com.

Bild 1: Simple GPS Test

Hur det ska se ut (i emulatorn)

"Bild" 2: Rättighet att använda GPS

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="se.nekotronic.simplegps"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="7" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".SimpleGPSTestActivity"
                  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>

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
</manifest>

Bild 3: Location-API:et

Location-API:et

"Bild" 4: Koden för Simple GPS Test

Tillägg 16 februari 2017: I den här lektionen används en äldre version av Android, och den gamla utvecklingsmiljön, Eclipse. Här finns en modernare version av programmet SimpleGPSTest, för Android Studio: SimpleGPSTest.zip. Koden för aktiviteten: MainActivity.java

Koden för den gamla aktiviteten: SimpleGPSTestActivity.java

    1	package se.nekotronic.simplegps;
    2	
    3	import java.text.DecimalFormat;
    4	
    5	import android.app.Activity;
    6	import android.content.Context;
    7	import android.location.Location;
    8	import android.location.LocationListener;
    9	import android.location.LocationManager;
   10	import android.location.LocationProvider;
   11	import android.os.Bundle;
   12	import android.text.format.Time;
   13	import android.widget.TextView;
   14	
   15	public class SimpleGPSTestActivity extends Activity {
   16	    private TextView texten = null;
   17	    private LocationManager location_manager;
   18	    private LocationListener location_listener;
   19	
   20	    private void print(String text) {
   21	        Time now = new Time();
   22	        now.setToNow();
   23	        String timeString = now.format("%H:%M:%S");
   24	        String line = timeString + ": " + text + "\n";
   25	        texten.setText(texten.getText() + line);
   26	        texten.invalidate();
   27	        texten.postInvalidate();
   28	    }
   29	
   30	    DecimalFormat dec = new DecimalFormat("0.0000");
   31	
   32	    /** Called when the activity is first created. */
   33	    @Override
   34	    public void onCreate(Bundle savedInstanceState) {
   35	        super.onCreate(savedInstanceState);
   36	        
   37	        texten = new TextView(this);
   38	        texten.setText("");
   39	        setContentView(texten);
   40	
   41	        print("onCreate");
   42	
   43	        location_manager =
   44	            (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
   45	        
   46	        location_listener = new LocationListener() {
   47	            @Override
   48	            public void onLocationChanged(Location location) {
   49	                double longitude = location.getLongitude();
   50	                double latitude = location.getLatitude();
   51	                double accuracy = location.getAccuracy();
   52	                double altitude= location.getAltitude();
   53	                print("New location: Long " + dec.format(longitude) +
   54	                      ", lat " + dec.format(latitude) +
   55	                      ", accuracy " + dec.format(accuracy) +
   56	                      ", alt " + dec.format(altitude));
   57	            }
   58	            
   59	            @Override
   60	            public void onProviderDisabled(String provider) {
   61	                 print("Location provider has been disabled.");
   62	            }
   63	
   64	            @Override
   65	            public void onProviderEnabled(String provider) {
   66	                 print("Good news! Location provider has been enabled.");
   67	            }
   68	
   69	            @Override
   70	            public void onStatusChanged(String provider, int status,
   71	                    Bundle extras) {
   72	                if (status == LocationProvider.OUT_OF_SERVICE)
   73	                    print("GPS status changed to OUT_OF_SERVICE.");
   74	                else if (status == LocationProvider.TEMPORARILY_UNAVAILABLE)
   75	                    print("GPS status changed to TEMPORARILY_UNAVAILABLE.");
   76	                else if (status == LocationProvider.AVAILABLE)
   77	                    print("Good news! GPS status changed to AVAILABLE.");
   78	            }
   79	        };
   80	    }
   81	
   82	    @Override
   83	    protected void onPause() {
   84	        super.onPause();
   85	        print("onPause");
   86	        location_manager.removeUpdates(location_listener);
   87	    }
   88	
   89	    @Override
   90	    protected void onResume() {
   91	        super.onResume();
   92	        print("onResume");
   93	        try {
   94	            // Register the listener with the Location Manager to receive
   95	            // location updates
   96	            location_manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, location_listener);
   97	        }
   98	        catch (Exception e) {
   99	            print("Couldn't use the GPS: " + e + ", " + e.getMessage());
  100	        }
  101	    }
  102	}

Bild 5: Starta appen i emulatorn

Emulator-bild 1

Bild 6: Skicka GPS-koordinater till emulatorn

Telnet

Kommandot geo fix tar longitud först, och sedan latitud. geo fix 59.7 15.3 ger alltså inte en punkt i närheten av Örebro, utan en punkt i havet utanför Oman.

Bild 7: GPS-koordinaterna syns i emulatorn

Emulator-bild 3

Bild 8: På en riktig telefon

HTC Desire

Bild 9: Den riktig telefonen, åt andra hållet

HTC Desire vänd åt andra hållet

Bild 10 (inte med på ljudspåret): På Google Nexus 7 och 5X

Ett tillägg från 2018 (inte med på ljudspåret): Här har jag provkört en version av Simple GPS Test på två enheter: en gammal Google Nexus 7, och en mer modern Google Nexus 5X.

På Google Nexus 5x

Man kan notera att rättigheter för appen att komma åt GPS:en hanteras på två olika sätt beroende på om det är en äldre eller en nyare Android-version. I äldre Android-versioner anger man rättigheterna i AndroidManifest.xml, och i nyare Android-versioner måste appen fråga användaren med ett anrop till metoden requestPermissions.

Övningar

Tillbaka till lektionslistan


Thomas Padron-McCarthy (thomas.padron-mccarthy@oru.se), 16 februari 2018