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;
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);
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" />
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" />
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.
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 ()).
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.
Benutze das
Geocoder geocoder = new Geocoder(this, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(lat, lng, 1);
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