Получите название города и почтовый индекс из Google Place API на Android

Я использую Google Place API для Android с автозаполнением

Все работает отлично, но когда я получаю результат, как показано здесь, у меня нет информации о городе и почтовом индексе.

    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());
    }
};

Класс Place не содержит эту информацию. Я могу получить полный человеческий читаемый адрес, lat и long и т.д.

Как я могу получить город и почтовый код из результата автозаполнения?

Ответы

Ответ 1

Обычно вы не можете получить название города с места,
но вы можете легко получить его таким образом:
1) Получить координаты с вашего места (или, тем не менее, вы их получите),
2) Используйте Geocoder для извлечения города по координатам.
Это можно сделать следующим образом:

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;
 }

Ответ 2

К сожалению, эта информация недоступна в Android API в настоящее время.

Он доступен с помощью веб-сервиса API-интерфейсов Places (https://developers.google.com/places/webservice/).

Ответ 3

Название города и почтовый код можно получить за 2 шага.

1) Выполнение вызова веб-службы https://maps.googleapis.com/maps/api/place/autocomplete/json?key=API_KEY&input=your_inpur_char. JSON содержит поле place_id, которое можно использовать на шаге 2.

2) Сделайте еще один вызов веб-службы https://maps.googleapis.com/maps/api/place/details/json?key=API_KEY&placeid=place_id_retrieved_in_step_1. Это вернет JSON, который содержит address_components. Прокрутка через types для поиска locality и postal_code может дать вам название города и почтовый индекс.

Код для его достижения

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")
                }
            }
        }

Ответ 4

Не лучший способ, но может быть полезно следующее:

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