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 クラスにはその情報が含まれていません。人間が読める完全な住所、緯度経度などを取得できます。
オートコンプリートの結果から都市と郵便番号を取得するにはどうすればよいですか?
通常、プレイスから都市名を取得することはできませんが、
しかし、この方法で簡単に入手できます。
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ステップで取得できます
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
をループして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")
}
}
}
残念ながら、現時点ではAndroid APIを介してこの情報を利用できません。
Places API Webサービス( https://developers.google.com/places/webservice/ )を使用して利用できます。
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);
}
}