Java tutorial
/* * Copyright 2012 University of South Florida * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package edu.usf.cutr.opentripplanner.android.pois; import android.util.Log; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.util.ArrayList; import java.util.HashMap; import edu.usf.cutr.opentripplanner.android.OTPApp; /** * A list of places obtained from Google's Places API * https://developers.google.com/places/documentation/ * * @author Khoa Tran */ public class GooglePlaces implements Places { private String request = "https://maps.googleapis.com/maps/api/place/textsearch/json?"; private String apiKey; public static final String PARAM_LOCATION = "location"; public static final String PARAM_RADIUS = "radius"; public static final String PARAM_NAME = "query"; // JSON Node names private static final String TAG_RESULTS = "results"; private static final String TAG_GEOMETRY = "geometry"; private static final String TAG_LOCATION = "location"; private static final String TAG_LATITUDE = "lat"; private static final String TAG_LONGITUDE = "lng"; private static final String TAG_NAME = "name"; private static final String TAG_FORMATTED_ADDRESS = "formatted_address"; JSONArray results = null; public GooglePlaces(String apiKey) { this.setApiKey(apiKey); } public JSONObject requestPlaces(String paramLocation, String paramRadius, String paramName) { StringBuilder builder = new StringBuilder(); String encodedParamLocation = ""; String encodedParamRadius = ""; String encodedParamName; try { if ((paramLocation != null) && (paramRadius != null)) { encodedParamLocation = URLEncoder.encode(paramLocation, OTPApp.URL_ENCODING); encodedParamRadius = URLEncoder.encode(paramRadius, OTPApp.URL_ENCODING); } encodedParamName = URLEncoder.encode(paramName, OTPApp.URL_ENCODING); } catch (UnsupportedEncodingException e1) { Log.e(OTPApp.TAG, "Error encoding Google Places request"); e1.printStackTrace(); return null; } if ((paramLocation != null) && (paramRadius != null)) { request += "location=" + encodedParamLocation; request += "&radius=" + encodedParamRadius; request += "&query=" + encodedParamName; } else { request += "query=" + encodedParamName; } request += "&sensor=false"; request += "&key=" + getApiKey(); Log.d(OTPApp.TAG, request); HttpURLConnection urlConnection = null; try { URL url = new URL(request); urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setConnectTimeout(OTPApp.HTTP_CONNECTION_TIMEOUT); urlConnection.setReadTimeout(OTPApp.HTTP_SOCKET_TIMEOUT); urlConnection.connect(); int status = urlConnection.getResponseCode(); if (status == HttpURLConnection.HTTP_OK) { BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); String line; while ((line = reader.readLine()) != null) { builder.append(line); } } else { Log.e(OTPApp.TAG, "Error obtaining Google Places response, status code: \" + status"); } } catch (IOException e) { Log.e(OTPApp.TAG, "Error obtaining Google Places response" + e.toString()); e.printStackTrace(); return null; } finally { if (urlConnection != null) { urlConnection.disconnect(); } } Log.d(OTPApp.TAG, builder.toString()); JSONObject json = null; try { json = new JSONObject(builder.toString()); } catch (JSONException e) { Log.e(OTPApp.TAG, "Error parsing Google Places data " + e.toString()); } return json; } public ArrayList<POI> getPlaces(HashMap<String, String> params) { ArrayList<POI> pois = new ArrayList<POI>(); String paramLocation = params.get(PARAM_LOCATION); String paramRadius = params.get(PARAM_RADIUS); String paramName = params.get(PARAM_NAME); // Get JSON JSONObject json = this.requestPlaces(paramLocation, paramRadius, paramName); if (json != null) { // Decrypt JSON try { results = json.getJSONArray(TAG_RESULTS); for (int i = 0; i < results.length(); i++) { JSONObject r = results.getJSONObject(i); String name = r.getString(TAG_NAME); String address = r.getString(TAG_FORMATTED_ADDRESS); JSONObject geometry = r.getJSONObject(TAG_GEOMETRY); JSONObject location = geometry.getJSONObject(TAG_LOCATION); double lat = location.getDouble(TAG_LATITUDE); double lon = location.getDouble(TAG_LONGITUDE); POI point = new POI(name, address, lat, lon); pois.add(point); } } catch (JSONException e) { Log.e(OTPApp.TAG, "Error parsing Google Places data " + e.toString()); e.printStackTrace(); } } return pois; } /** * @return the apiKey */ public String getApiKey() { return apiKey; } /** * @param apiKey the apiKey to set */ public void setApiKey(String apiKey) { this.apiKey = apiKey; } }