2009-01-23 5 views
45

Ich versuche, eine Adresse basierend auf dem Long/Lat zu bekommen. es scheint, dass so etwas funktionieren sollte?Android: Reverse Geocoding - GetFromLocation

Geocoder myLocation = Geocoder(Locale.getDefault()); 
    List myList = myLocation.getFromLocation(latPoint,lngPoint,1); 

Das Problem ist, dass ich bekomme immer wieder: Die Methode Geocoder (Locale) ist nicht definiert für den Typ savemaplocation

Jede Hilfe wäre hilfreich. Vielen Dank.


Danke, habe ich versucht, den Kontext, locale eine erste, und das scheiterte und wurde auf einige der anderen Konstrukteuren suchen (hatte ich einen gesehen, der gerade locale erwähnt hatte). Unabhängig davon,

Es hat nicht funktioniert, wie ich noch immer: Die Methode Geocoder (Context, Locale) für den Typ savemaplocation undefiniert ist

Ich habe zu tun: import android.location.Geocoder;

Antwort

62

Der folgende Codeausschnitt ist für mich tun es (lat und lng Doppelzimmer oberhalb dieses Bit angegeben):

Geocoder geocoder = new Geocoder(this, Locale.getDefault()); 
List<Address> addresses = geocoder.getFromLocation(lat, lng, 1); 
+1

Ich habe es auch versucht, jedes Mal, wenn ich versuche, die Adressliste anzuzeigen, bombardiert es. Nicht sicher, was vor sich geht. Ich werde in ein oder zwei Tagen mit einer neuen App versuchen, um zu sehen, was ich finden kann. – Chrispix

+4

Ich fand dies sehr hilfreich für die Positionierung von Sachen: http://blogoscoped.com/archive/2008-12-15-n14.html –

+1

... auch ich habe die folgenden zwei Berechtigungen in meinem Manifest: Als ich einen von ihnen verpasst habe (kann mich nicht erinnern welcher) Die App warf einen wirklich nicht hilfreichen Fehler auf. –

34

Es sieht so aus, als würden hier zwei Dinge passieren.

1) Sie haben das Schlüsselwort new vor dem Aufruf des Konstruktors verpasst.

2) Der Parameter, den Sie an den Geocoder-Konstruktor übergeben, ist falsch. Sie passieren eine Locale, wo es eine Context erwartet.

Es gibt zwei Geocoder Bauer, die beide eine Context erfordern, und man auch eine Einnahme Locale:

Geocoder(Context context, Locale locale) 
Geocoder(Context context) 

Lösung

Ändern Sie den Code in einem gültigen Kontext passieren und umfassen new und du solltest gut gehen.

Geocoder myLocation = new Geocoder(getApplicationContext(), Locale.getDefault()); 
List<Address> myList = myLocation.getFromLocation(latPoint, lngPoint, 1); 

Hinweis

Wenn Sie immer noch Probleme haben kann es eine Permissionierung Problem sein. Die Geocodierung verwendet implizit das Internet, um die Suchvorgänge durchzuführen. Daher benötigt Ihre Anwendung in Ihrem Manifest ein INTERNET use-permission-Tag.

Fügen Sie den folgenden uses-permission-Knoten in den Knoten manifest Ihres Manifests ein.

<uses-permission android:name="android.permission.INTERNET" /> 
+0

Danke, ich glaube, ich arbeite auch spät in der Nacht, nicht sicher, was zu meinem neuen passiert ist. Ich glaube ich habe es ursprünglich vergessen, steckte es wieder an, als ich nur mein Locale hatte, und dann, als ich zurück ging, habe ich es wieder vergessen .. Ich weiß es zu schätzen .. – Chrispix

+0

Keine Sorge, ich habe es auch das erste Mal nicht entdeckt :) –

2

Nun, ich bin immer noch ratlos. Also hier ist mehr Code.

Bevor ich meine Karte verlasse, rufe ich an SaveLocation(myMapView,myMapController); Das ist, was am Ende meine Geocodierungsinformationen aufruft.

Aber da getFromLocation ein IOException werfen kann, hatte ich es wirft IOExceptions die folgenden nennen SaveLocation

try 
{ 
    SaveLocation(myMapView,myMapController); 
} 
catch (IOException e) 
{ 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

Dann muss ich SaveLocation tun ändern, indem er sagte:

public void SaveLocation(MapView mv, MapController mc) throws IOException{ 
    //I do this : 
    Geocoder myLocation = new Geocoder(getApplicationContext(), Locale.getDefault()); 
    List myList = myLocation.getFromLocation(latPoint, lngPoint, 1); 
//... 
    } 

Und es stürzt ab jedes Mal.

+0

Könnte ein Berechtigungsproblem sein. Der Geocodierer verwendet das Internet, um die Suchvorgänge durchzuführen, sodass Sie eine Internetverwendungsberechtigung benötigen. Die Antwort wurde mit Details aktualisiert. –

+0

Ich habe die Internetberechtigungen für das Mapping dort. Sehr merkwürdig, warum es immer wieder versagt. Lass mich einen Logcat bekommen. – Chrispix

+0

Dies ist die Ausnahme, die ich bekomme: java.lang.IllegalArgumentException: Breite == 3.2945512E7 – Chrispix

0

Ich habe gehört, dass Geocoder auf der Buggy Seite. Ich habe kürzlich eine Beispielanwendung zusammengestellt, die den http-Geokodierungsdienst von Google verwendet, um den Standort von lat/long abzurufen. Fühlen Sie sich frei, check it out hier

http://www.smnirven.com/?p=39

40

Hier ist ein vollständiges Beispiel Code ein Thema und einen Handler mit der Geocoder Antwort zu erhalten, ohne die Benutzeroberfläche zu blockieren.

Geocoder Call-Verfahren kann in einem Helper-Klasse

public static void getAddressFromLocation(
     final Location location, final Context context, final Handler handler) { 
    Thread thread = new Thread() { 
     @Override public void run() { 
      Geocoder geocoder = new Geocoder(context, Locale.getDefault()); 
      String result = null; 
      try { 
       List<Address> list = geocoder.getFromLocation(
         location.getLatitude(), location.getLongitude(), 1); 
       if (list != null && list.size() > 0) { 
        Address address = list.get(0); 
        // sending back first address line and locality 
        result = address.getAddressLine(0) + ", " + address.getLocality(); 
       } 
      } catch (IOException e) { 
       Log.e(TAG, "Impossible to connect to Geocoder", e); 
      } finally { 
       Message msg = Message.obtain(); 
       msg.setTarget(handler); 
       if (result != null) { 
        msg.what = 1; 
        Bundle bundle = new Bundle(); 
        bundle.putString("address", result); 
        msg.setData(bundle); 
       } else 
        msg.what = 0; 
       msg.sendToTarget(); 
      } 
     } 
    }; 
    thread.start(); 
} 

Hier ist der Aufruf dieser Geocoder Prozedur in Ihrer UI Aktivität befinden:

getAddressFromLocation(mLastKownLocation, this, new GeocoderHandler()); 

Und der Handler die Ergebnisse zeigen in Ihre UI:

private class GeocoderHandler extends Handler { 
    @Override 
    public void handleMessage(Message message) { 
     String result; 
     switch (message.what) { 
     case 1: 
      Bundle bundle = message.getData(); 
      result = bundle.getString("address"); 
      break; 
     default: 
      result = null; 
     } 
     // replace by what you need to do 
     myLabel.setText(result); 
    } 
} 

Vergessen Sie nicht, die folgende Erlaubnis in Ihrezu setzen

+0

der Code funktioniert einwandfrei, gute Basis, um weitere Anpassungen vorzunehmen – John

+0

Dies ist korrekt, sonst wird Android durch 'NetworkOnMainThreadException'.Alternativ kann man sogar eine einfachere' AsyncTask' verwenden, um dies zu tun – Nezam

+0

Umgekehrte geocodierte Adresse erscheint mehrmals. Ich weiß nicht warum? –

4

Zuerst Breitengrad und Längengrad mit Location und LocationManager-Klasse abrufen. Jetzt versuchen Sie den folgenden Code für Holen Sie sich die Stadt, Adresse info

Stadt info ist jetzt in sb. Konvertiere nun das sb in String (mit sb.toString()).

+0

gesetzt haben Thanks this half! – morty346

7

Der Grund dafür ist der nicht vorhandene Backend Service:

Die Geocoder Klasse erfordert einen Back-End-Dienst, der nicht im Kern Android-Framework enthalten ist. Die Geocoder-Abfragemethoden geben eine leere Liste zurück, wenn auf der Plattform kein Back-End-Dienst vorhanden ist.

+0

Dies ist die richtige Antwort. Die anderen Antworten funktionieren nicht ohne Backend. – ajeh

0

verwendet

Geocoder geocoder = new Geocoder(this, Locale.getDefault()); 
List<Address> addresses = geocoder.getFromLocation(lat, lng, 1);