Location bestimmen

  • Antworten:11
Danny
  • Forum-Beiträge: 37

06.05.2010, 23:22:51 via Website

Hi zusammen,

nun versuche ich mit meiner App die aktuelle Position (Location) des Handys abzufragen. Ich verwende dazu nachfolgenden Code. Wenn ich in Zeile 27 den Befehl "v_breite = (double) v_curLocation.getLatitude();" drin lasse, bekomme ich die Fehlermeldung "Sorry! The application has stopped unexpectedly. Please try again. Force close" (bei Auskommentierung des Befehls läuft das Programm fehlerlos). Liegt das daran, dass ich das Programm über Eclipse (also den Emulator) laufen lasse und so keine echten/richtigen GPS-Infos erhalte? Würde es dann vielleicht auf nem Handy (mit GPS-Modul) funktionieren?

Ich hoffe ihr könnt mir wieder weiterhelfen. Danke erneut für Eure Mühen.

Gruß, Danny

1...
2import android.location.Location;
3import android.location.LocationListener;
4import android.location.LocationManager;
5import android.content.Context;
6...
7public class activity2 extends Activity {
8 ...
9 Location v_curLocation;
10 LocationManager v_locationmanager;
11 double v_breite;
12 double v_laenge;
13
14 public void onCreate(Bundle savedInstanceState) {
15 super.onCreate(savedInstanceState);
16 setContentView(R.layout.main2);
17
18 //Location bestimmen:
19 //http://developer.android.com/guide/topics/security/security.html#permissions
20 //im Manifest wurden folgende Permissions gesetzt:
21 //<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
22 //<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"></uses-permission>
23 v_locationmanager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
24 v_curLocation = v_locationmanager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
25 //bis hier her läuft das Programm einwandfrei
26 v_breite = (double) v_curLocation.getLatitude();
27 //mit dieser Zeile erhalte ich Fehlermeldung: Sorry! The application has stopped unexpectedly. Please try again. Force close
28 }
29}

Antworten
Danny
  • Forum-Beiträge: 37

07.05.2010, 11:03:43 via Website

Hi zusammen,

ich habe jetzt noch gelesen, dass bei manchen Location based services noch folgender Befehl eingefügt wird:

1v_locationmanager.requestLocationUpdates(
2 LocationManager.GPS_PROVIDER,
3 0,
4 0,
5 this
6 );

Ich habe diesen Befehl auch mal im Anschluss an Zeile 23 eingebunden. Leider hat es noch nicht zu einer Besserung geführt.

Oder muss ich vielleicht noch einen so genannten LocationListener bauen? Aber so wie ich das verstanden habe, benötigt man den nur, wenn man kontinuierlich die Position ermittelt - d.h. die Location aktualisiert sich bei Bewegung.

In meinem Fall will ich aber ganz simpel nur zum Zeitpunkt der Ausführung der App die Position ermitteln (ohne Aktualisierung falls Nutzer sich bewegt). Wenn sich dann die Position verändert, muss man halt die App neu starten, um die dann aktuelel Position zu erhalten. Sehe ich das so richtig?

Hoffe ihr könnt mir wieder ein paar Tipps geben.

Gruß, Danny

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

07.05.2010, 12:10:52 via Website

Ich bin zur Zeit in der Firma, kann Dir aber am Nachmittag mal reinstellen wie es in einer meiner Apps mal gelöst hab.

Was mir in soweit auffällt, du sprichst da den GPS-Provider an ... weisst aber gar nicht ob der überhaupt aktiviert ist?
(theoretisch sollte da ja nur null zurückkommen ... aber .. )

Was sagt eingentlich die Logcat-Ausgabe zu dem Fehler ?


bis dahin ...

— geändert am 07.05.2010, 12:16:07

lg Voss

Antworten
Danny
  • Forum-Beiträge: 37

07.05.2010, 12:49:36 via Website

Geht mir ähnlich (bin auch noch in der Firma).
Schaue mir heute Nachmittag/Abend dann mal die Ausgabe noch mal an.

Den GPS-Provider hatte ich gestern auch schon mal geprüft, indem ich den Wert der Konstanten Context.LOCATION_SERVICE (aus Zeile 23) ausgegeben habe. Ergebnis war die Zeichenkette "gps" ;-) Nehme an, dass das in Ordnung ist, oder?

Gruß, Danny

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

07.05.2010, 17:16:54 via Website

So, nachdem ich nun zuhaus angelangt bin und die wichtigsten Dinge erledigt hab .. (Füße hochlegen, massieren lassen, Käffchen schlürfen ... ) :)
hab ich das mal eben rauskopiert ...
1// Begin Locationfetch
2
3 LocationManager lm = (LocationManager) this.getSystemService(LOCATION_SERVICE);
4 List<String> providers = lm.getProviders(true);
5
6 double altitude = 0;
7 double longitude =0;
8 double latitude = 0;
9
10 for (String p : providers) {
11 Location loc = lm.getLastKnownLocation(p);
12
13 Log.d("WFC", p); //Would be "gps" or "network"
14 float bearing = 0;
15 Log.e("DEBUG_TAG",loc.toString());
16 if (loc != null) {
17 if (loc.hasAltitude())
18 altitude = loc.getAltitude();
19 latitude = loc.getLatitude();
20 longitude = loc.getLongitude();
21 lat = loc.convert(latitude, loc.FORMAT_DEGREES).replace(",", "")+"0";
22 lon = loc.convert(longitude, loc.FORMAT_DEGREES).replace(",", "")+"0";
23 if (loc.hasBearing())
24 bearing = loc.getBearing();
25 Log.e(DEBUG_TAG,"Message:"+lat);
26 Log.e(DEBUG_TAG,"Message:"+lon);
27 content += "Provider ["+p+"] has alt:"+altitude+", lat:"+lat+", long:"+lon+" at bearing:"+bearing;
28 } else {
29 content += "Provider ["+p+"] has no location info";
30 }
31 }
32 // End Locationfetch

Damit fragst Du alle verfügbaren Provider ab. Du bekommst ein Timestamp feld mTime mitgeliefert im Ergebnis, anhand dessen Du bestimmen kannst, wie alt die LocationAngabe ist. Je nach dem wie genau Du es brauchst, würde ich ggf. auf den network Provider zurückgreifen, der ist in der Regel so gut wie immer und überall verfügbar. Nur halt nicht so genau. Ansonsten musst vorher checken ob GPS enabled ist.

lg Voss

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

07.05.2010, 17:18:41 via Website

Danny
Geht mir ähnlich (bin auch noch in der Firma).
Schaue mir heute Nachmittag/Abend dann mal die Ausgabe noch mal an.

Den GPS-Provider hatte ich gestern auch schon mal geprüft, indem ich den Wert der Konstanten Context.LOCATION_SERVICE (aus Zeile 23) ausgegeben habe. Ergebnis war die Zeichenkette "gps" ;-) Nehme an, dass das in Ordnung ist, oder?

Gruß, Danny

Das GPS stimmt schon .. eh klar, Du fragst ja auch nichts anderes ab.

lg Voss

Antworten
Danny
  • Forum-Beiträge: 37

07.05.2010, 23:16:07 via Website

Danke. Hab Deinen Quellcode jetzt bei mir eingebaut. Anschließend habe ich die App gestartet und bin dann in die DDMS Perspective gewechselt um eine KML-Datei hochzuladen bzw. abzuspielen. Das hat auch geklappt (siehe Logcat-Ausschnitt hier:

). Sicherheitshalber frage ich den Wert meiner Location jetzt auf null ab und siehe da: sie ist null (trotz abgespielter KML-Datei). Das Programm stürtzt also nicht mehr ab, sondern liefert null als Location.

Seltsam. Naja, am Montag bekomme ich mein Android Handy und werde die App dann dort mal direkt ausprobieren. Vielleicht klappt es ja live besser als in der GPS-Simulation am PC. Ich berichte dann wieder ;-)

Schönes Wochenende.

Gruß, Danny

— geändert am 07.05.2010, 23:42:20

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

07.05.2010, 23:32:36 via Website

Trag doch mal im Eclipse beim Location control, dort wo Du auch das KML hochlädst im Reiter "manual" eine GPS koordinate ein ...

Dann bekommst Du auch kein "NULL" zurück ...... Hier gehts nicht um die KML Inhalte sondern darum das Dein Programm keine GPS Location Daten empfängt weil eben KEINE da sind.

Die KML Daten sind keine GPS Koordinaten ... GPS wird in meinem Script theoretisch als letztes abgefragt. Zuerst Network und dann GPS, hat ja auch der Emulator beides. Wenn Du keine weitere Einschränkung in der Loop vornimmst, ist halt der letzte Wert der aktuelle nach dem durchlaufen .. Und das ist ein leeres (NULL) GPS Object.

P.S. Aus Deinem Screenshot des LOGCAT ist so gar nix zu erkennen. Ausser das keine Exception geschmissen wird. Bau Dir mal an den Schlüsselstellen so Log Ausgaben ein wie ich das im Beispiel gemacht hab ... ala : Log.d("Meine app", "Mein AusgabeValue");

lg Voss

Antworten
Danny
  • Forum-Beiträge: 37

08.05.2010, 00:00:45 via Website

Ok, hab jetzt mal manuell eine GPS-Koordinate eingegeben und an den Emulator abgeschickt. Komischerweise habe ich keinerlei Rückmeldung von Eclipse erhalten. Müsste da nicht wenigstens im Log Cat irgendwas drinstehen (z.B. "GPS-Koordinate empfangen")?

Ich werde morgen - wie von Dir vorgeschlagen - meine App mit einigen Log-Punkten versehen. Vielleicht liefer das ja weiteren Aufschluss.

Danke zu so später Stunde.

Gruß, Danny

Antworten
Danny
  • Forum-Beiträge: 37

10.05.2010, 22:43:35 via Website

So, habe heute meine App erstmals "live" auf nem per USB angeschlossenem Android-Testgerät (HTC Hero) ausprobiert. Und siehe da: die Location-Bestimmung funktioniert so wie beschrieben. Es hat also irgendwie mit der Simulation der GPS-Komponente am PC nicht funktioniert.

Danke noch mal für Eure Hilfe.

Gruß, Danny

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

11.05.2010, 21:53:38 via Website

Gerne ... und auf beantwortet ...

lg Voss

Antworten
Danny
  • Forum-Beiträge: 37

04.07.2010, 11:33:42 via Website

Hallo zusammen,

zum Thema "Location bestimmen" hätte ich jetzt doch noch eine Frage. Nachdem ich meine App - wie oben beschrieben - auf dem HTC Hero zum Laufen gebracht habe, wollte ich sie nun mal auf dem Sony Ericsson XPERIA X10 mini pro laufen lassen (Handy ist per USB-Kabel angeschlossen; "USB-Debugging" Einstellung ist aktiviert). Dort bekomme ich zwar mit folgendem Quellcode als Rückgabewert "GPS" für den GPS-Provider im Loc Cat:

1v_locationmanager = (LocationManager) this
2 .getSystemService(LOCATION_SERVICE);
3 Log.d("GPS_PROVIDER", LocationManager.GPS_PROVIDER);

Allerdings kann ich im weiteren Schritt leider keine letzte bekannte Location ermitteln. Der Wert für v_curLocation bleibt null.

1v_curLocation = v_locationmanager
2 .getLastKnownLocation(LocationManager.GPS_PROVIDER);

Habt ihr eine Idee was hier anders läuft als auf dem HTC?

Vielen Dank schon einmal für Eure Unterstützung.

Gruß, Daniel



P.S. Im AndroidManifest.xml stehen - wie schon auf dem HTC - folgende Permissions drin:
1<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
2 <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"></uses-permission>

Antworten