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

Я использую API Google Place для 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 не содержит эта информация. Я могу получить полный адрес, читаемый человеком, широту и долготу и т. Д.

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


person Plumillon Forge    schedule 21.04.2015    source источник


Ответы (6)


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

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;
 }
person Leo Droidcoder    schedule 09.06.2016
comment
... должен добавить блок try и catch для обработки исключения IOException, иначе он не будет компилироваться. - person S bruce; 11.10.2016
comment
Он будет компилироваться. Внимательно проверьте объявление метода - person Leo Droidcoder; 11.10.2016

Название города и почтовый индекс можно получить за 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")
                }
            }
        }
person AbhishekB    schedule 24.11.2015

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

Он доступен с помощью веб-службы Places API (https://developers.google.com/places/webservice/). .

person plexer    schedule 23.04.2015
comment
Да, я делаю это за 2 шага (второй - это вызов веб-службы). Это так странно, что нет этой информации и нет возможности ее получить! - person Plumillon Forge; 23.04.2015

private Geocoder geocoder;
private final int REQUEST_PLACE_ADDRESS = 40;

onCreate

Places.initialize(context, getString(R.string.google_api_key));

Intent intent = new Autocomplete.IntentBuilder(AutocompleteActivityMode.FULLSCREEN, Arrays.asList(Place.Field.ADDRESS_COMPONENTS, Place.Field.NAME, Place.Field.ADDRESS, Place.Field.LAT_LNG)).build(context);
startActivityForResult(intent, REQUEST_PLACE_ADDRESS);

onActivityResult

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == REQUEST_PLACE_ADDRESS && resultCode == Activity.RESULT_OK) {
        Place place = Autocomplete.getPlaceFromIntent(data);
        Log.e("Data",Place_Data: Name: " + place.getName() + "\tLatLng: " + place.getLatLng() + "\tAddress: " + place.getAddress() + "\tAddress Component: " + place.getAddressComponents());

        try {
            List<Address> addresses;
            geocoder = new Geocoder(context, Locale.getDefault());

            try {
                addresses = geocoder.getFromLocation(place.getLatLng().latitude, place.getLatLng().longitude, 1); // Here 1 represent max location result to returned, by documents it recommended 1 to 5
                String address1 = addresses.get(0).getAddressLine(0); // If any additional address line present than only, check with max available address lines by getMaxAddressLineIndex()
                String address2 = addresses.get(0).getAddressLine(1); // If any additional address line present than only, check with max available address lines by getMaxAddressLineIndex()
                String city = addresses.get(0).getLocality();
                String state = addresses.get(0).getAdminArea();
                String country = addresses.get(0).getCountryName();
                String postalCode = addresses.get(0).getPostalCode();

                Log.e("Address1: ", "" + address1);
                Log.e("Address2: ", "" + address2);
                Log.e("AddressCity: ", "" + city);
                Log.e("AddressState: ", "" + state);
                Log.e("AddressCountry: ", "" + country);
                Log.e("AddressPostal: ", "" + postalCode);
                Log.e("AddressLatitude: ", "" + place.getLatLng().latitude);
                Log.e("AddressLongitude: ", "" + place.getLatLng().longitude);
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
            //setMarker(latLng);
        }
    }
}
person Ketan Ramani    schedule 14.11.2019
comment
Спасибо, это работает для меня - person Amit Sharma; 26.07.2021

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

 Log.i(TAG, "Place city and postal code: " + place.getAddress().subSequence(place.getName().length(),place.getAddress().length()));
person Gennady Kozlov    schedule 30.11.2016
comment
использование геокодера определенно будет лучшим способом решения этой проблемы, см. stackoverflow.com/a/35992244/1107579 - person RayChongJH; 19.12.2018

person    schedule
comment
Пожалуйста, объясните свой ответ - person Mike; 15.10.2018
comment
Когда у вас есть Place object. Этот объект для поиска широты и долготы Затем создайте объект геокодера mGeocoder, чтобы найти метод getFromLocation для передачи широты и долготы, который даст вам адресный объект в адресном объекте, чтобы найти всю информацию - person Radhey; 15.10.2018