Step 1 :- Create New Android Project.
Step 2 :- Add Google-play-services_lib to your project.
Step 3 :- Open AndroidManifest.xml file.
<!--?xml version="1.0" encoding="utf-8"?--> package="com.mapv2.demo" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <permission android:name="com.mapv2.demo.permission.MAPS_RECEIVE" android:protectionLevel="signature" /> <uses-feature android:glEsVersion="0x00020000" android:required="true"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.mapv2.demo.MainActivity" android:label="@string/app_name" > <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="AIzaSyCmX7SLVHXxU9pSqb2QbAOvdnjAGUulOrk"/>
Step 4 :- Open activity_main.xml.
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <com.mapv2.demo.CustomAutoCompleteTextView android:id="@+id/atv_places" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:hint="@string/str_atv_places" android:textColor="#000000" android:singleLine="true" /> <fragment android:id="@+id/map" android:layout_width="wrap_content" android:layout_height="wrap_content" class="com.google.android.gms.maps.SupportMapFragment" android:layout_below="@id/atv_places" />
Step 5 :- Open MainActivity.java
package com.mapv2.demo; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.HashMap; import java.util.List; import org.json.JSONObject; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.text.Editable; import android.text.TextWatcher; import android.util.Log; import android.view.Menu; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.AutoCompleteTextView; import android.widget.ListView; import android.widget.SimpleAdapter; import com.google.android.gms.maps.CameraUpdate; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.MarkerOptions; public class MainActivity extends FragmentActivity { AutoCompleteTextView atvPlaces; DownloadTask placesDownloadTask; DownloadTask placeDetailsDownloadTask; ParserTask placesParserTask; ParserTask placeDetailsParserTask; GoogleMap googleMap; final int PLACES=0; final int PLACES_DETAILS=1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Getting a reference to the AutoCompleteTextView atvPlaces = (AutoCompleteTextView) findViewById(R.id.atv_places); atvPlaces.setThreshold(1); // Adding textchange listener atvPlaces.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // Creating a DownloadTask to download Google Places matching "s" placesDownloadTask = new DownloadTask(PLACES); // Getting url to the Google Places Autocomplete api String url = getAutoCompleteUrl(s.toString()); // Start downloading Google Places // This causes to execute doInBackground() of DownloadTask class placesDownloadTask.execute(url); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // TODO Auto-generated method stub } @Override public void afterTextChanged(Editable s) { // TODO Auto-generated method stub } }); // Setting an item click listener for the AutoCompleteTextView dropdown list atvPlaces.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int index, long id) { ListView lv = (ListView) arg0; SimpleAdapter adapter = (SimpleAdapter) arg0.getAdapter(); HashMap<String, String> hm = (HashMap<String, String>) adapter.getItem(index); // Creating a DownloadTask to download Places details of the selected place placeDetailsDownloadTask = new DownloadTask(PLACES_DETAILS); // Getting url to the Google Places details api String url = getPlaceDetailsUrl(hm.get("reference")); // Start downloading Google Place Details // This causes to execute doInBackground() of DownloadTask class placeDetailsDownloadTask.execute(url); } }); } private String getAutoCompleteUrl(String place){ // Obtain browser key from https://code.google.com/apis/console String key = "key=AIzaSyCfdXATlz7jtM6MEvy9Xh_3_g_Ivc5ysXE"; // place to be be searched String input = "input="+place; // place type to be searched String types = "types=geocode"; // Sensor enabled String sensor = "sensor=false"; // Building the parameters to the web service String parameters = input+"&"+types+"&"+sensor+"&"+key; // Output format String output = "json"; // Building the url to the web service String url = "https://maps.googleapis.com/maps/api/place/autocomplete/"+output+"?"+parameters; return url; } private String getPlaceDetailsUrl(String ref){ // Obtain browser key from https://code.google.com/apis/console String key = "key=YOUR_API_KEY"; // reference of place String reference = "reference="+ref; // Sensor enabled String sensor = "sensor=false"; // Building the parameters to the web service String parameters = reference+"&"+sensor+"&"+key; // Output format String output = "json"; // Building the url to the web service String url = "https://maps.googleapis.com/maps/api/place/details/"+output+"?"+parameters; return url; } /** A method to download json data from url */ private String downloadUrl(String strUrl) throws IOException{ String data = ""; InputStream iStream = null; HttpURLConnection urlConnection = null; try{ URL url = new URL(strUrl); // Creating an http connection to communicate with url urlConnection = (HttpURLConnection) url.openConnection(); // Connecting to url urlConnection.connect(); // Reading data from url iStream = urlConnection.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(iStream)); StringBuffer sb = new StringBuffer(); String line = ""; while( ( line = br.readLine()) != null){ sb.append(line); } data = sb.toString(); br.close(); }catch(Exception e){ Log.d("Exception while downloading url", e.toString()); }finally{ iStream.close(); urlConnection.disconnect(); } return data; } // Fetches data from url passed private class DownloadTask extends AsyncTask<String, Void, String>{ private int downloadType=0; // Constructor public DownloadTask(int type){ this.downloadType = type; } @Override protected String doInBackground(String... url) { // For storing data from web service String data = ""; try{ // Fetching the data from web service data = downloadUrl(url[0]); }catch(Exception e){ Log.d("Background Task",e.toString()); } return data; } @Override protected void onPostExecute(String result) { super.onPostExecute(result); switch(downloadType){ case PLACES: // Creating ParserTask for parsing Google Places placesParserTask = new ParserTask(PLACES); // Start parsing google places json data // This causes to execute doInBackground() of ParserTask class placesParserTask.execute(result); break; case PLACES_DETAILS : // Creating ParserTask for parsing Google Places placeDetailsParserTask = new ParserTask(PLACES_DETAILS); // Starting Parsing the JSON string // This causes to execute doInBackground() of ParserTask class placeDetailsParserTask.execute(result); } } } /** A class to parse the Google Places in JSON format */ private class ParserTask extends AsyncTask<String, Integer, List<HashMap<String,String>>>{ int parserType = 0; public ParserTask(int type){ this.parserType = type; } @Override protected List<HashMap<String, String>> doInBackground(String... jsonData) { JSONObject jObject; List<HashMap<String, String>> list = null; try{ jObject = new JSONObject(jsonData[0]); switch(parserType){ case PLACES : PlaceJSONParser placeJsonParser = new PlaceJSONParser(); // Getting the parsed data as a List construct list = placeJsonParser.parse(jObject); break; case PLACES_DETAILS : PlaceDetailsJSONParser placeDetailsJsonParser = new PlaceDetailsJSONParser(); // Getting the parsed data as a List construct list = placeDetailsJsonParser.parse(jObject); } }catch(Exception e){ Log.d("Exception",e.toString()); } return list; } @Override protected void onPostExecute(List<HashMap<String, String>> result) { switch(parserType){ case PLACES : String[] from = new String[] { "description"}; int[] to = new int[] { android.R.id.text1 }; // Creating a SimpleAdapter for the AutoCompleteTextView SimpleAdapter adapter = new SimpleAdapter(getBaseContext(), result, android.R.layout.simple_list_item_1, from, to); // Setting the adapter atvPlaces.setAdapter(adapter); break; case PLACES_DETAILS : HashMap<String, String> hm = result.get(0); // Getting latitude from the parsed data double latitude = Double.parseDouble(hm.get("lat")); // Getting longitude from the parsed data double longitude = Double.parseDouble(hm.get("lng")); // Getting reference to the SupportMapFragment of the activity_main.xml SupportMapFragment fm = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); // Getting GoogleMap from SupportMapFragment googleMap = fm.getMap(); LatLng point = new LatLng(latitude, longitude); CameraUpdate cameraPosition = CameraUpdateFactory.newLatLng(point); CameraUpdate cameraZoom = CameraUpdateFactory.zoomBy(5); // Showing the user input location in the Google Map googleMap.moveCamera(cameraPosition); googleMap.animateCamera(cameraZoom); MarkerOptions options = new MarkerOptions(); options.position(point); options.title("Position"); options.snippet("Latitude:"+latitude+",Longitude:"+longitude); // Adding the marker in the Google Map googleMap.addMarker(options); break; } } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
1.) CustomAutoCompleteTextView.java
package com.mapv2.demo; import java.util.HashMap; import android.content.Context; import android.util.AttributeSet; import android.widget.AutoCompleteTextView; /** Customizing AutoCompleteTextView to return Place Description * corresponding to the selected item */ public class CustomAutoCompleteTextView extends AutoCompleteTextView { public CustomAutoCompleteTextView(Context context, AttributeSet attrs) { super(context, attrs); } /** Returns the Place Description corresponding to the selected item */ @Override protected CharSequence convertSelectionToString(Object selectedItem) { /** Each item in the autocompetetextview suggestion list is a hashmap object */ HashMap<String, String> hm = (HashMap<String, String>) selectedItem; return hm.get("description"); } }
2.) PlaceDetailsJSONParser.java
package com.mapv2.demo; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import org.json.JSONException; import org.json.JSONObject; public class PlaceDetailsJSONParser { /** Receives a JSONObject and returns a list */ public List<HashMap<String,String>> parse(JSONObject jObject){ Double lat = Double.valueOf(0); Double lng = Double.valueOf(0); HashMap<String, String> hm = new HashMap<String, String>(); List<HashMap<String, String>> list = new ArrayList<HashMap<String,String>>(); try { lat = (Double)jObject.getJSONObject("result").getJSONObject("geometry").getJSONObject("location").get("lat"); lng = (Double)jObject.getJSONObject("result").getJSONObject("geometry").getJSONObject("location").get("lng"); } catch (JSONException e) { e.printStackTrace(); }catch(Exception e){ e.printStackTrace(); } hm.put("lat", Double.toString(lat)); hm.put("lng", Double.toString(lng)); list.add(hm); return list; } }
3.) PlaceJSONParser.java
package com.mapv2.demo; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; public class PlaceJSONParser { /** Receives a JSONObject and returns a list */ public List<HashMap<String,String>> parse(JSONObject jObject){ JSONArray jPlaces = null; try { /** Retrieves all the elements in the 'places' array */ jPlaces = jObject.getJSONArray("predictions"); } catch (JSONException e) { e.printStackTrace(); } /** Invoking getPlaces with the array of json object * where each json object represent a place */ return getPlaces(jPlaces); } private List<HashMap<String, String>> getPlaces(JSONArray jPlaces){ int placesCount = jPlaces.length(); List<HashMap<String, String>> placesList = new ArrayList<HashMap<String,String>>(); HashMap<String, String> place = null; /** Taking each place, parses and adds to list object */ for(int i=0; i <placesCount;i++){ try { /** Call getPlace with place JSON object to parse the place */ place = getPlace((JSONObject)jPlaces.get(i)); placesList.add(place); } catch (JSONException e) { e.printStackTrace(); } } return placesList; } /** Parsing the Place JSON object */ private HashMap<String, String> getPlace(JSONObject jPlace){ HashMap<String, String> place = new HashMap<String, String>(); String id=""; String reference=""; String description=""; try { description = jPlace.getString("description"); id = jPlace.getString("id"); reference = jPlace.getString("reference"); place.put("description", description); place.put("_id",id); place.put("reference",reference); } catch (JSONException e) { e.printStackTrace(); } return place; } }
Step 6 :- Run Code.
Leave a Reply