2015-04-21 17 views
14

Ich verwende Google Place API for Android mit der automatischen VervollständigungErhalten Stadtname und Postleitzahl von Google Platz API auf Android

Alles funktioniert gut, aber wenn ich das Ergebnis wie here gezeigt, ich habe nicht die Stadt haben und Postleitzahl Information.

private ResultCallback<PlaceBuffer> mUpdatePlaceDetailsCallback 
     = new ResultCallback<PlaceBuffer>() { 
    @Override 
    public void onResult(PlaceBuffer places) { 
     if (!places.getStatus().isSuccess()) { 
      // Request did not complete successfully 
      Log.e(TAG, "Place query did not complete. Error: " + places.getStatus().toString()); 

      return; 
     } 
     // Get the Place object from the buffer. 
     final Place place = places.get(0); 

     // Format details of the place for display and show it in a TextView. 
     mPlaceDetailsText.setText(formatPlaceDetails(getResources(), place.getName(), 
       place.getId(), place.getAddress(), place.getPhoneNumber(), 
       place.getWebsiteUri())); 

     Log.i(TAG, "Place details received: " + place.getName()); 
    } 
}; 

Die Place Klasse enthält nicht die Informationen. Ich kann die vollständige lesbare Adresse erhalten, die Lat und lang, etc.

Wie kann ich die Stadt und die Postleitzahl vom Autocomplete-Ergebnis erhalten?

Antwort

8

Leider sind diese Informationen derzeit nicht über die Android-API verfügbar.

Es ist mit dem Places API Web Service (https://developers.google.com/places/webservice/) verfügbar.

+1

Ja ich, dass in zwei Schritten am Ende tun (die zweiten Aufruf an das ist
Es kann wie folgt durchgeführt werden Internetservice). Das ist so komisch, dass es diese Informationen und keine Möglichkeit gibt, sie wiederzufinden! –

8

Stadtname und Postleitzahl kann in 2 Schritten

1) Erstellen einer Web-Service-Aufruf zu https://maps.googleapis.com/maps/api/place/autocomplete/json?key=API_KEY&input=your_inpur_char abgerufen werden. JSON enthält das Feld place_id, das in Schritt 2 verwendet werden kann.

2) Führen Sie einen weiteren Web-Service-Anruf unter https://maps.googleapis.com/maps/api/place/details/json?key=API_KEY&placeid=place_id_retrieved_in_step_1 aus. Dies wird ein JSON zurückgeben, das address_components enthält. Looping durch die types zu finden locality und postal_code können Sie den Namen der Stadt und die Postleitzahl geben.

-Code es

JSONArray addressComponents = jsonObj.getJSONObject("result").getJSONArray("address_components"); 
     for(int i = 0; i < addressComponents.length(); i++) { 
      JSONArray typesArray = addressComponents.getJSONObject(i).getJSONArray("types"); 
      for (int j = 0; j < typesArray.length(); j++) { 
       if (typesArray.get(j).toString().equalsIgnoreCase("postal_code")) { 
        postalCode = addressComponents.getJSONObject(i).getString("long_name"); 
       } 
       if (typesArray.get(j).toString().equalsIgnoreCase("locality")) { 
        city = addressComponents.getJSONObject(i).getString("long_name") 
       } 
      } 
     } 
21

erreichen Sie normalerweise nicht Namen der Stadt aus dem Ort abrufen können,
aber man kann es leicht auf diese Weise erhalten:
1) Koordinaten von Ihrem Platz bekommen (oder wie auch immer Sie bekommen sie);
2) Verwenden Sie Geocoder, um Stadt nach Koordinaten abzurufen.

private Geocoder mGeocoder = new Geocoder(getActivity(), Locale.getDefault()); 

// ... 

private String getCityNameByCoordinates(double lat, double lon) throws IOException { 

    List<Address> addresses = mGeocoder.getFromLocation(lat, lon, 1); 
    if (addresses != null && addresses.size() > 0) { 
     return addresses.get(0).getLocality(); 
    } 
    return null; 
} 
+1

Das hat für mich funktioniert. Vielen Dank! – rundavidrun

+0

Sie sind herzlich willkommen! –

+0

... muss einen try- und catch-Block hinzufügen, um die IOException zu verarbeiten. Andernfalls wird sie nicht kompiliert. –

0

Nicht die beste Art und Weise, aber die folgende kann nützlich sein:

Log.i(TAG, "Place city and postal code: " + place.getAddress().subSequence(place.getName().length(),place.getAddress().length())); 
+0

Nicht gearbeitet ..... –