aktuelle GPS-Koordinaten auslesen

  • Antworten:15
  • Bentwortet
Yves B.
  • Forum-Beiträge: 21

08.05.2011, 16:58:22 via Website

Hallo zusammen

ich arbeite momentan an einer App welche die aktuellen GPS-Daten auslesen und anschliessend in eine Datenbank speichern soll. Leider ist mein Location-Objekt welches ich für die Positionsbestimmung verwende immer null. Habe schon mehrere Vorgehensweisen anhand Tutorials ausprobiert, komme aber nicht an die gewünschte Lösung heran.

Oder liegt mein Problem ganz woanders und ich kann mit dem Editor / AVD keine GPS-Daten abfragen? Ich habe dazu in Eclipse unter Emulator Control/Location Controls die Längen- und Breitengrade eingetragen.

1// Aktuelle Position bestimmen
2 LocationManager lm = (LocationManager) this.getSystemService(LOCATION_SERVICE);
3 loc = lm.getLastKnownLocation("gps");
4
5 if (loc == null)
6 {
7 Log.d(LOG_TAG, "Location ist null");
8 } else
9 {
10 Log.d(LOG_TAG, "Location ist: " + loc.getLatitude());
11 }

Freundliche Grüsse
Yves

— geändert am 08.05.2011, 21:59:18

Antworten
Yves B.
  • Forum-Beiträge: 21

09.05.2011, 16:03:55 via Website

Hat mir noch keiner eine Lösung?

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

09.05.2011, 16:15:59 via Website

naja grundsätzlich nicht so falsch,
wenn du aber keine lastknownlocation hast, solltest du den locationlistener einbinden und warten bis dein gps eine location bekommt.

also stichwort LocationListener

swordiApps Blog - Website

Antworten
Yves B.
  • Forum-Beiträge: 21

09.05.2011, 17:25:30 via Website

Danke, werde ich gleich mal ausprobieren. Nur finde ich es leider ein wenig schade, dass es keine einfachere Möglichkeit gibt, denn ich möchte bloss die aktuelle Position zur Zeit wo der Button geklickt wurde auslesen. Listener werden eigentlich verwendet, um über einen Zeitraum hinweg ein Objekt zu überwachen.

Antworten
Gelöschter Account
  • Forum-Beiträge: 408

09.05.2011, 18:08:03 via Website

Yves B.
Danke, werde ich gleich mal ausprobieren. Nur finde ich es leider ein wenig schade, dass es keine einfachere Möglichkeit gibt, denn ich möchte bloss die aktuelle Position zur Zeit wo der Button geklickt wurde auslesen. Listener werden eigentlich verwendet, um über einen Zeitraum hinweg ein Objekt zu überwachen.

Das ist richtig, der LocationListener überwacht deine GPS-Hardware und meldet sich zurück, wenn die Position ermittelt bzw. geändert wurde.
Schließlich hat deine GPS-Hardware nicht zum Zeitpunkt des Buttonklicks direkt schon deinen Standort ermittelt, sondern muss erst einen Fix abwarten.

Hier ein Snippet aus einer meiner Anwendungen:

in onCreate():
1locManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
2 if (!locManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
3 AlertDialog.Builder noGPS = new AlertDialog.Builder(this);
4 noGPS.setTitle("GPS nicht eingeschaltet");
5 noGPS.setCancelable(false);
6 noGPS.setMessage("GPS ist nicht eingeschaltet, die Anwendung wird nun beendet!");
7 noGPS.setPositiveButton("Schließen", new DialogInterface.OnClickListener() {
8
9 public void onClick(DialogInterface dialog, int which) {
10 finish();
11 }
12 });
13 noGPS.show();
14 } else {
15 startTime = new Date();
16 locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 0, this);
17 userWait = ProgressDialog.show(this, "", "Position wird bestimmt...", true, true, new DialogInterface.OnCancelListener() {
18
19 public void onCancel(DialogInterface dialog) {
20 onPause();
21 }
22 });
23 }

1@Override
2 public void onPause() {
3 super.onPause();
4 locManager.removeUpdates(this);
5 finish();
6 }
7
8public void onLocationChanged(Location location) {
9 if (location != null) {
10 SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy|HH:mm:ss");
11 Date endTime = new Date();
12 String dateTimeString = dateFormat.format(endTime);
13 Double dLatitude = location.getLatitude();
14 Double dLongitude = location.getLongitude();
15 et_latitude.setText(dLatitude.toString());
16 et_longitude.setText(dLongitude.toString());
17 et_datetime.setText(dateTimeString);
18 btn_savePosition.setEnabled(true);
19 locManager.removeUpdates(this);
20 Integer secsTillFix = Math.round((endTime.getTime() - startTime.getTime()) / 1000);
21 et_secsTillFix.setText(secsTillFix.toString() + " s");
22 userWait.dismiss();
23 }
24 }

Gruß Oli - Diese Nachricht wurde mit einer Taschenlampe in das offenliegende Ende eines Glasfaserkabels gemorst! - Follow me on Twitter - AndroitPIT-Regeln

Yves B.

Antworten
Yves B.
  • Forum-Beiträge: 21

09.05.2011, 18:31:27 via Website

Hallo Oliver

leider habe ich Schwierigkeiten mit deinem Code-Beispiel. Ich erhalte eine Exception welche ich im Debug-Modus jedoch nicht nachvollziehen kann. Ich habe mir gedacht, dass ich auf meiner Map erst dann zu dem GeoPoint navigiere, wenn ich die GPS-Daten durch die LocationChanged Methode bekommen habe. Doch es funktioniert nicht so wie ich es mir vorgestellt hatte.

map.java
1public class map extends MapActivity{
2
3 final static String LOG_TAG = "Deja-vu";
4 private int latitude = 0;
5 private int longitude = 0;
6
7 // View-Objekte
8 private List<Overlay> overlayList;
9 private Drawable drawable;
10 private map_stecknadel stecknadel;
11 private Spinner spinner;
12 private MapView mapview;
13 private EditText edittext;
14 private LocationManager locmanager;
15 private Location loc;
16
17 // Datenbankvariablen
18 final static String MY_DB_NAME = "Dejavu";
19 final static String MY_DB_TABLE = "tb_daten";
20 final static String TAG = "ensacom";
21
22 public void onCreate(Bundle savedInstanceState) {
23 super.onCreate(savedInstanceState);
24 setContentView(R.layout.map);
25
26 // Spinner mit Daten abfüllen
27 spinner = (Spinner) findViewById(R.id.spinner);
28 ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
29 this, R.array.spinner_data, android.R.layout.simple_spinner_item);
30 adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
31 spinner.setAdapter(adapter);
32
33 locmanager = (LocationManager) this.getSystemService(LOCATION_SERVICE);
34 locmanager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 0, (LocationListener) this);
35
36 }
37
38 public void onLocationChanged(Location loc) {
39 if (loc != null) {
40 latitude = (int) loc.getLatitude();
41 longitude = (int) loc.getLongitude();
42 Log.d(LOG_TAG, "Location wurde gewechslet");
43 // Jetzt kann die Map gesteuert werden
44 createMap();
45 }
46 }
47
48 private void createMap() {
49
50 // Aktuellen Koordinatenpunkt erstellen
51 GeoPoint point = new GeoPoint(latitude, longitude);
52
53 // MapView Einstellungen setzen
54 mapview = (MapView) findViewById(R.id.mapview);
55 mapview.setBuiltInZoomControls(true);
56 mapview.setStreetView(true);
57 MapController controller = mapview.getController();
58 int zoomlevel = mapview.getMaxZoomLevel();
59 controller.setZoom(zoomlevel - 4);
60 controller.setCenter(point);
61
62 // Stecknadel erstellen
63 overlayList = mapview.getOverlays();
64 drawable = this.getResources().getDrawable(R.drawable.stecknadel);
65 stecknadel = new map_stecknadel(drawable);
66 OverlayItem overlayitem = new OverlayItem(point, "", "");
67
68 // Stecknadel hinzufügen
69 stecknadel.addStecknadel(overlayitem);
70 overlayList.add(stecknadel);
71
72 }


Ich bin mir aber auch nicht sicher, ob ich in Eclipse die GPS-Koordinaten richtig setze. Ich habe einfach unter Windows/Show View den Emulator Control hinzugefügt, in welchem ich während der Laufzeit jeweils manuell die GPS-Koordinaten eintrage.

Antworten
Gelöschter Account
  • Forum-Beiträge: 408

09.05.2011, 18:35:51 via Website

Yves B.
Hallo Oliver

leider habe ich Schwierigkeiten mit deinem Code-Beispiel. Ich erhalte eine Exception welche ich im Debug-Modus jedoch nicht nachvollziehen kann. Ich habe mir gedacht, dass ich auf meiner Map erst dann zu dem GeoPoint navigiere, wenn ich die GPS-Daten durch die LocationChanged Methode bekommen habe. Doch es funktioniert nicht so wie ich es mir vorgestellt hatte.

Hast du 1. die Permission gesetzt, dass du GPS nutzen darfst?
Hast du 2. nen GoogleMapsAPIKey (bzw. 2! einen fürs debuggen, einen für den Release) zur Benutzung der MapView?

— geändert am 09.05.2011, 18:36:06

Gruß Oli - Diese Nachricht wurde mit einer Taschenlampe in das offenliegende Ende eines Glasfaserkabels gemorst! - Follow me on Twitter - AndroitPIT-Regeln

Yves B.

Antworten
Yves B.
  • Forum-Beiträge: 21

09.05.2011, 18:40:43 via Website

Oliver D.

Hast du 1. die Permission gesetzt, dass du GPS nutzen darfst?
Hast du 2. nen GoogleMapsAPIKey (bzw. 2! einen fürs debuggen, einen für den Release) zur Benutzung der MapView?

1. Ja die steht im Manifest.xml
2. Ja, ich habe ebenfalls einen gültigen API-Key

Antworten
Gelöschter Account
  • Forum-Beiträge: 408

09.05.2011, 18:48:42 via Website

Hm..

könntest du mal den StackTrace posten ab "Caused by"?

Du kannst den Fix bestimmen über Telnet:

Telnet starten: "telnet localhost 5554" (5554 ist die Nummer deines Emulators, die steht in der Titelzeile)
und dann einfach "geo fix 49 7" oder wie deine Koordinaten auch lauten sollen

Gruß Oli - Diese Nachricht wurde mit einer Taschenlampe in das offenliegende Ende eines Glasfaserkabels gemorst! - Follow me on Twitter - AndroitPIT-Regeln

Antworten
Yves B.
  • Forum-Beiträge: 21

09.05.2011, 18:56:09 via Website

Hier habe ich mal den Stacktrace:
105-09 16:55:28.077: ERROR/AndroidRuntime(372): Caused by: java.lang.ClassCastException: ch.kaestlibeutler.map
205-09 16:55:28.077: ERROR/AndroidRuntime(372): at ch.kaestlibeutler.map.onCreate(map.java:57)
305-09 16:55:28.077: ERROR/AndroidRuntime(372): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
405-09 16:55:28.077: ERROR/AndroidRuntime(372): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
505-09 16:55:28.077: ERROR/AndroidRuntime(372): ... 11 more


Der Fehler scheint auf dieser Zeile zu liegen:
1locmanager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 0, (LocationListener) this);

— geändert am 09.05.2011, 18:58:04

Antworten
Gelöschter Account
  • Forum-Beiträge: 408

09.05.2011, 19:03:29 via Website

Yves B.
Hier habe ich mal den Stacktrace:
105-09 16:55:28.077: ERROR/AndroidRuntime(372): Caused by: java.lang.ClassCastException: ch.kaestlibeutler.map
205-09 16:55:28.077: ERROR/AndroidRuntime(372): at ch.kaestlibeutler.map.onCreate(map.java:57)
305-09 16:55:28.077: ERROR/AndroidRuntime(372): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
405-09 16:55:28.077: ERROR/AndroidRuntime(372): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
505-09 16:55:28.077: ERROR/AndroidRuntime(372): ... 11 more


Der Fehler scheint auf dieser Zeile zu liegen:
1locmanager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 0, (LocationListener) this);

Das Casten zum LocationListener ist der Fehler (siehe fett), mach das mal weg ;)

Gruß Oli - Diese Nachricht wurde mit einer Taschenlampe in das offenliegende Ende eines Glasfaserkabels gemorst! - Follow me on Twitter - AndroitPIT-Regeln

Yves B.

Antworten
Yves B.
  • Forum-Beiträge: 21

09.05.2011, 19:08:49 via Website

Das Casten zum LocationListener ist der Fehler (siehe fett), mach das mal weg ;)

Dann kommt der mir mit einer Fehlermeldung, der letzte Parameter von requestLocationUpdates muss ein LocationListener und keine Map sein. Ich muss dort irgendwie noch einen LocationListener hinzufügen, doch ich verwende ja jetzt gar keinen? Dies würde doch einem früheren Post von dir wiedersprechen?

Antworten
Gelöschter Account
  • Forum-Beiträge: 408

09.05.2011, 19:10:46 via Website

Sry habe noch ne wichtige Zeile vergessen:

1public class GPSLogActivity extends Activity implements LocationListener {

Gruß Oli - Diese Nachricht wurde mit einer Taschenlampe in das offenliegende Ende eines Glasfaserkabels gemorst! - Follow me on Twitter - AndroitPIT-Regeln

Yves B.

Antworten
Yves B.
  • Forum-Beiträge: 21

09.05.2011, 19:24:12 via Website

Vielen Dank für deine Bemühungen, jetzt stürzt die App nicht mehr ab und ich sehe im Logcat meinen Post mit "Location wurde gewechselt". Ich bekomme zwar jedesmal den gleichen Kartenausschnitt, so muss ich nochmals fragen wo du die Konsolenbefehle in Eclipse eintippst? Habe extern versucht Telnet zu öffnen, funktioniert jedoch nicht. Oder muss ich dies in Eclipse verwenden?

Ich habe herausgefunden, dass meine Map immer zum Punkt 0:0 navigiert. Jedoch schreibt es mir jeweils die Koordinaten welche ich in Eclipse setze ins Logcat.

Danke für deine Hilfe

— geändert am 09.05.2011, 19:37:24

Antworten
Yves B.
  • Forum-Beiträge: 21

09.05.2011, 19:56:07 via Website

Yves B.
Vielen Dank für deine Bemühungen, jetzt stürzt die App nicht mehr ab und ich sehe im Logcat meinen Post mit "Location wurde gewechselt". Ich bekomme zwar jedesmal den gleichen Kartenausschnitt, so muss ich nochmals fragen wo du die Konsolenbefehle in Eclipse eintippst? Habe extern versucht Telnet zu öffnen, funktioniert jedoch nicht. Oder muss ich dies in Eclipse verwenden?

Ich habe herausgefunden, dass meine Map immer zum Punkt 0:0 navigiert. Jedoch schreibt es mir jeweils die Koordinaten welche ich in Eclipse setze ins Logcat.

Danke für deine Hilfe


Ich habs jetz gerade geschafft! Natürlich muss ich den Double zuerst noch * 1E6 rechnen und diesen anschliessend zum int casten. Nun bekomme ich jeweils die richtige Position auf der Karte, wenn ich die Ortsposition aktualisiere.

Danke Oliver, du weisst gar nicht wie wichtig mir das ist. :D Ohne deine Hilfe hätte ich noch lange im trüben gefischt. Wünsche dir noch einen schönen Abend ;)

Antworten
Gelöschter Account
  • Forum-Beiträge: 408

09.05.2011, 20:13:02 via Website

Yves B.
Yves B.
Vielen Dank für deine Bemühungen, jetzt stürzt die App nicht mehr ab und ich sehe im Logcat meinen Post mit "Location wurde gewechselt". Ich bekomme zwar jedesmal den gleichen Kartenausschnitt, so muss ich nochmals fragen wo du die Konsolenbefehle in Eclipse eintippst? Habe extern versucht Telnet zu öffnen, funktioniert jedoch nicht. Oder muss ich dies in Eclipse verwenden?

Ich habe herausgefunden, dass meine Map immer zum Punkt 0:0 navigiert. Jedoch schreibt es mir jeweils die Koordinaten welche ich in Eclipse setze ins Logcat.

Danke für deine Hilfe


Ich habs jetz gerade geschafft! Natürlich muss ich den Double zuerst noch * 1E6 rechnen und diesen anschliessend zum int casten. Nun bekomme ich jeweils die richtige Position auf der Karte, wenn ich die Ortsposition aktualisiere.

Danke Oliver, du weisst gar nicht wie wichtig mir das ist. :D Ohne deine Hilfe hätte ich noch lange im trüben gefischt. Wünsche dir noch einen schönen Abend ;)

Hehe, kein Ding ;)
Viel Spaß noch beim Aufbauen deiner App ;)

Gleichfalls

— geändert am 09.05.2011, 20:13:16

Gruß Oli - Diese Nachricht wurde mit einer Taschenlampe in das offenliegende Ende eines Glasfaserkabels gemorst! - Follow me on Twitter - AndroitPIT-Regeln

Antworten