2010-12-31 8 views
4

Ich gehe die letzten zwei Tage mit einem IllegalArgumentException Fehler aus dem Kopf, den ich in Android-Code erhalte, wenn ich versuche, Koordinaten aus einer Adresse zu bekommen, oder sogar umgekehrt, Adresse außerhalb der geografischen Länge und Breite. Dies ist der Code, aber ich kann keinen Fehler sehen. Es ist ein Standard-Code-Snippet, das bei einer Google-Suche leicht gefunden wird.geocoder.getFromLocationName gibt nur null zurück

public GeoPoint determineLatLngFromAddress(Context appContext, String strAddress) { 
    Geocoder geocoder = new Geocoder(appContext, Locale.getDefault()); 
    GeoPoint g = null; 
    try { 
     System.out.println("str addres: " + strAddress); 
     List<Address> addresses = geocoder.getFromLocationName(strAddress, 5); 
     if (addresses.size() > 0) { 
      g = new GeoPoint(
       (int) (addresses.get(0).getLatitude() * 1E6), 
       (int) (addresses.get(0).getLongitude() * 1E6) 
      ); 
     } 
    } catch (Exception e) { 
     throw new IllegalArgumentException("locationName == null"); 
    } 
    return g; 
} 

Dies sind die Berechtigungen von manifest.xml Datei:

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> 

habe ich den Google-API-Schlüssel zu erklärt: <uses-library android:name="com.google.android.maps" />

Aus dem Codeausschnitt oben, geocoder ist nicht null, weder ist die address oder appContext, und ich stolpere hier: geocoder.getFromLocationName(strAddress, 5);

habe ich eine Menge von Google Suche und fand nichts, das funktionierte, und die wichtigsten Informationen fand ich, ist dies:

Die Geocoder Klasse erfordert einen Back-End-Dienst, der nicht im Kern Android-Framework enthalten ist.

Sooo, ich bin jetzt verwirrt. Was muss ich aufrufen, importieren, hinzufügen, im Code verwenden .... damit das funktioniert? Ich benutze Google API 2.2, API Level 8. Wenn jemand eine Lösung dafür gefunden hat, oder ein Zeiger für die Dokumentation, etwas, das ich nicht entdeckt habe, lass es uns wissen.

Antwort

0

Führen Sie Ihren Code auf Android 2.0, es wird funktionieren. Ich hatte das gleiche Problem mit May Code. Es funktioniert nicht in 2.2, weiß nicht, warum

+0

Ich werde es mit Android2.0 versuchen, danke.Hoffentlich wird es funktionieren, wenn ja, werden Sie wissen lassen. Frohes neues Jahr! – test

+0

Frohes neues Jahr auch Sie! – Sandy

11

Ich hatte ein ähnliches Problem und fand, dass die Abfrage des Geocoders, bis ich ein Ergebnis bearbeitet habe. Hier ist, wie ich es gemacht habe, funktioniert bisher großartig.

try { 
    List<Address> geoResults = geocoder.getFromLocationName("<address goes here>", 1); 
    while (geoResults.size()==0) { 
     geoResults = geocoder.getFromLocationName("<address goes here>", 1); 
    } 
    if (geoResults.size()>0) { 
     Address addr = geoResults.get(0); 
     myLocation.setLatitude(addr.getLatitude()); 
     myLocation.setLongitude(addr.getLongitude()); 
    } 
} catch (Exception e) { 
    System.out.print(e.getMessage()); 
} 
+0

@ chris..dint Arbeit für mich –

+0

können Sie mehr Details zur Verfügung stellen? – chris

+1

ich konnte es beheben. Ich hatte die Android-Karten-App geschlossen. Nach dem Neustart habe ich den Emulator neu gestartet. es funktionierte gut –

2
public LatLng determineLatLngFromAddress(Context appContext, String strAddress) { 
     LatLng latLng = null; 
     Geocoder geocoder = new Geocoder(appContext, Locale.getDefault()); 
     List<Address> geoResults = null; 

     try { 
      geoResults = geocoder.getFromLocationName(strAddress, 1); 
      while (geoResults.size()==0) { 
       geoResults = geocoder.getFromLocationName(strAddress, 1); 
      } 
      if (geoResults.size()>0) { 
       Address addr = geoResults.get(0); 
       latLng = new LatLng(addr.getLatitude(),addr.getLongitude()); 
      } 
     } catch (Exception e) { 
      System.out.print(e.getMessage()); 
     } 

    return latLng; //LatLng value of address 
    } 
+0

Zum ersten Mal, wenn es kein Ergebnis gibt, dann wird es Ergebnis für Mai versuchen.? –

2

Hatte das gleiche Problem. Pooling funktionierte nicht so habe ich dies den Standort zu erhalten: Geocoding Responses

Verwenden Sie diese Klasse JSONObject der Lage zu bekommen:

public class GetLocationDownloadTask extends AsyncTask<String, Void, String> { 

    @Override 
    protected String doInBackground(String... strings) { 


     String result = ""; 
     URL url; 
     HttpURLConnection urlConnection; 
     try { 
      url = new URL(strings[0]); 
      urlConnection = (HttpURLConnection) url.openConnection(); 
      InputStream is = urlConnection.getInputStream(); 
      InputStreamReader inputStreamReader = new InputStreamReader(is); 

      int data = inputStreamReader.read(); 
      while(data != -1){ 
       char curr = (char) data; 
       result += curr; 
       data = inputStreamReader.read(); 
      } 
      return result; 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 

     if(result != null) { 
      try { 
       JSONObject locationObject = new JSONObject(result); 
       JSONObject locationGeo = locationObject.getJSONArray("results").getJSONObject(0).getJSONObject("geometry").getJSONObject("location"); 


      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 

    } 

Sie können erstellen und die Klasseninstanz wie folgt ausführen:

String link = "https://maps.googleapis.com/maps/api/geocode/json?address=" + addressString + "&key={YOUR_API_KEY}"; 

GetLocationDownloadTask getLocation = new GetLocationDownloadTask(); 

getLocation.execute(link);