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. 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 "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 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 Bild 6: Skicka GPS-koordinater till emulatorn 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 Bild 8: På en riktig telefon Bild 9: Den riktig telefonen, å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. 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 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), 16 februari 2018
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>
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 }
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.
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.