web-dev-qa-db-ja.com

AndroidでGoogle Place APIから都市名と郵便番号を取得します

Android用Google Place API をオートコンプリートで使用しています

すべて正常に機能しますが、示されているように結果が得られたとき here 、都市と郵便番号の情報がありません。

    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 クラスにはその情報が含まれていません。人間が読める完全な住所、緯度経度などを取得できます。

オートコンプリートの結果から都市と郵便番号を取得するにはどうすればよいですか?

17
Plumillon Forge

通常、プレイスから都市名を取得することはできませんが、
しかし、この方法で簡単に入手できます。
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;
 }
26
Leo Droidcoder

都市名と郵便番号は2ステップで取得できます

1) https://maps.googleapis.com/maps/api/place/autocomplete/json?key=API_KEY&input=your_inpur_char へのWebサービス呼び出しを行います。 JSONには、ステップ2で使用できるplace_idフィールドが含まれています。

2) https://maps.googleapis.com/maps/api/place/details/json?key=API_KEY&placeid=place_id_retrieved_in_step_1 に別のWebサービス呼び出しを行います。これは、address_componentsを含むJSONを返します。 typesをループしてlocalitypostal_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")
                }
            }
        }
15
AbhishekB

残念ながら、現時点ではAndroid APIを介してこの情報を利用できません。

Places API Webサービス( https://developers.google.com/places/webservice/ )を使用して利用できます。

9
plexer
try{
    getPlaceInfo(place.getLatLng().latitude,place.getLatLng().longitude);
catch (Exception e){
    e.printStackTrace();
}

// ......

private void getPlaceInfo(double lat, double lon) throws IOException {
        List<Address> addresses = mGeocoder.getFromLocation(lat, lon, 1);
        if (addresses.get(0).getPostalCode() != null) {
            String Zip = addresses.get(0).getPostalCode();
            Log.d("Zip CODE",Zip);
        }

        if (addresses.get(0).getLocality() != null) {
            String city = addresses.get(0).getLocality();
            Log.d("CITY",city);
        }

        if (addresses.get(0).getAdminArea() != null) {
            String state = addresses.get(0).getAdminArea();
            Log.d("STATE",state);
        }

        if (addresses.get(0).getCountryName() != null) {
            String country = addresses.get(0).getCountryName();
            Log.d("COUNTRY",country);
        }
    }
3
Radhey