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.

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

SimpleGPSTestActivity.java

Ett tillägg från 2012 (inte med på ljudspåret):
I nyare versioner av Android-miljön kan det hända att metoderna i LocationListener, dvs onLocationChanged med flera, inte ska deklareras med @Override. Om det ger kompileringsfel, så prova att ta bort @Override. Här finns en modernare version av programmet, som ett Eclipse-projekt (10 oktober 2012): Simple_GPS_Test.zip

    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

Ett tillägg från 2012 (inte med på ljudspåret): Här har jag provkört den modernare versionen av Simple GPS Test på en modernare enhet, en Google Nexus 7.

På Google Nexus 7

Övningar

Tillbaka till lektionslistan


Thomas Padron-McCarthy (thomas.padron-mccarthy@oru.se), 11 oktober 2012