Tillbaka till lektionslistan
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 "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 "Bild" 4: Koden för Simple GPS Test SimpleGPSTestActivity.java Ett tillägg våren 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. 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 Bild 6: Skicka GPS-koordinater till emulatorn Bild 7: GPS-koordinaterna syns i emulatorn Bild 8: På en riktig telefon Bild 9: Den riktig telefonen, åt andra hållet Övningar Skapa projektet i Eclipse och provkör programmet. Om du har en riktigt telefon med GPS, provkör på den. Hur snabba uppdateringar får man av postionen? Hur mycket fel visar GPS:en? Läs mer om GPS-positionering på Android-webbplatsen. Under fliken Dev Guide finns rubriken Location and Maps. Läs mer om aktiviteter (Activity) på Android-webbplatsen, och om aktiviteternas livscykel, med metoderna onCreate, onResume, onPause, onStop, onDestroy med flera. På Dev Guide finns avsnittet Activities. Glöm inte rubriken Saving activity state. Tillbaka till lektionslistan Thomas Padron-McCarthy (thomas.padron-mccarthy@oru.se), 22 februari 2012
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.
<?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>
Ett tillägg våren 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.
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 }