web-dev-qa-db-de.com

Android: Geokodierung umkehren - getFromLocation

Ich versuche, eine Adresse zu erhalten, die auf dem Long/Lat basiert. es scheint, dass so etwas funktionieren sollte? 

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

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

Jede Hilfe wäre hilfreich. Vielen Dank.


Danke, ich habe den Kontext ausprobiert, Locale eins zuerst, und das schlug fehl und sah einige der anderen Konstruktoren an (ich hatte einen gesehen, der nur Locale erwähnt hatte). Ungeachtet,

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

Ich habe: Import Android.location.Geocoder;

48
Chrispix

Das folgende Code-Snippet macht es für mich (lat und lng sind Doubles, die über diesem Bit deklariert werden):

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

Hier ist ein vollständiger Beispielcode mit einem Thread und einem Handler, um die Geocoder-Antwort zu erhalten, ohne die Benutzeroberfläche zu blockieren.

Geocoder-Aufrufverfahren, kann in einer Helper-Klasse gespeichert werden

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 an dieses Geocoder-Verfahren in Ihrer UI-Aktivität:

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

Und der Handler, um die Ergebnisse in Ihrer Benutzeroberfläche anzuzeigen:

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 Berechtigung in Ihren Manifest.xml einzufügen.

<uses-permission Android:name="Android.permission.INTERNET" />
47
EricLarch

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

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

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

Es gibt zwei Geocoder-Konstruktoren, für die beide eine Context und einer für eine Locale erforderlich ist:

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

Lösung

Ändern Sie den Code so, dass er in einem gültigen Kontext übergeben wird, und fügen Sie new hinzu.

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

Hinweis

Wenn Sie immer noch Probleme haben, kann dies ein Problem mit der Berechtigung sein. Bei der Geokodierung wird implizit das Internet für die Suche verwendet. Daher erfordert Ihre Anwendung in Ihrem Manifest ein INTERNET uses-permission-Tag. 

Fügen Sie den folgenden Knoten für die Verwendung von Berechtigungen in den Knoten manifest Ihres Manifests ein.

<uses-permission Android:name="Android.permission.INTERNET" />
35
Reto Meier

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

Die Geocoder-Klasse erfordert einen Backend-Service, der nicht im Android-Kernframework enthalten ist. Die Geocoder-Abfragemethoden geben eine leere Liste zurück, wenn auf der Plattform kein Backend-Service vorhanden ist. 

8
Ingo

Holen Sie sich zuerst Latitude und Longitude mithilfe der Location and LocationManager-Klasse. Versuchen Sie nun den untenstehenden Code für Get the city, address info

double latitude = location.getLatitude();
double longitude = location.getLongitude();
Geocoder gc = new Geocoder(this, Locale.getDefault());
try {
    List<Address> addresses = gc.getFromLocation(lat, lng, 1);
    StringBuilder sb = new StringBuilder();
    if (addresses.size() > 0) {
        Address address = addresses.get(0);
        for (int i = 0; i < address.getMaxAddressLineIndex(); i++)
            sb.append(address.getAddressLine(i)).append("\n");
            sb.append(address.getLocality()).append("\n");
            sb.append(address.getPostalCode()).append("\n");
            sb.append(address.getCountryName());
    }

Stadtinfo ist jetzt in jdm. Konvertieren Sie nun den sb in String (mit sb.toString ()). 

4
Antony

Nun, ich bin immer noch ratlos. Hier ist also mehr Code. 

Bevor ich meine Karte verlasse, rufe ich SaveLocation(myMapView,myMapController); auf. Dies ist das, was letztendlich meine Geokodierungsinformationen anruft.

Da jedoch getFromLocation eine IOException werfen kann, musste ich Folgendes tun, um SaveLocation aufzurufen

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

Dann muss ich SaveLocation ändern, indem ich sage, dass IOExceptions ausgelöst werden: 

 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 jedes Mal ab.

2
Chrispix

Benutze das

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

Ich habe gehört, dass Geocoder auf der fehlerhaften Seite ist. Ich habe kürzlich eine Beispielanwendung zusammengestellt, die den HTTP-Geokodierungsdienst von Google verwendet, um den Standort von Lat/Long zu suchen. Fühlen Sie sich frei, hier zu schauen

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

0
user186939