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" > <activity android:name="com.mapv2.demo.PlaceDetailsActivity" 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" > <Spinner android:id="@+id/spr_place_type" android:layout_width="wrap_content" android:layout_height="60dp" android:layout_alignParentTop="true" /> <Button android:id="@+id/btn_find" android:layout_width="wrap_content" android:layout_height="60dp" android:layout_alignParentTop="true" android:layout_toRightOf="@id/spr_place_type" android:text="@string/str_btn_find" /> android:id="@+id/map" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/spr_place_type" class="com.google.android.gms.maps.SupportMapFragment" />
1.) activity_place_details.xml
<!--?xml version="1.0" encoding="utf-8"?--> android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <WebView android:id="@+id/wv_place_details" android:layout_width="fill_parent" android:layout_height="match_parent" />
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.app.Dialog; import android.content.Intent; import android.location.Criteria; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.Spinner; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesUtil; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.GoogleMap.OnInfoWindowClickListener; import com.google.android.gms.maps.GoogleMap.OnMarkerClickListener; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.Marker; import com.google.android.gms.maps.model.MarkerOptions; public class MainActivity extends FragmentActivity implements LocationListener{ GoogleMap mGoogleMap; Spinner mSprPlaceType; String[] mPlaceType=null; String[] mPlaceTypeName=null; double mLatitude=0; double mLongitude=0; HashMap<String, String> mMarkerPlaceLink = new HashMap<String, String>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Array of place types mPlaceType = getResources().getStringArray(R.array.place_type); // Array of place type names mPlaceTypeName = getResources().getStringArray(R.array.place_type_name); // Creating an array adapter with an array of Place types // to populate the spinner ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, mPlaceTypeName); // Getting reference to the Spinner mSprPlaceType = (Spinner) findViewById(R.id.spr_place_type); // Setting adapter on Spinner to set place types mSprPlaceType.setAdapter(adapter); Button btnFind; // Getting reference to Find Button btnFind = ( Button ) findViewById(R.id.btn_find); // Getting Google Play availability status int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getBaseContext()); if(status!=ConnectionResult.SUCCESS){ // Google Play Services are not available int requestCode = 10; Dialog dialog = GooglePlayServicesUtil.getErrorDialog(status, this, requestCode); dialog.show(); }else { // Google Play Services are available // Getting reference to the SupportMapFragment SupportMapFragment fragment = ( SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); // Getting Google Map mGoogleMap = fragment.getMap(); // Enabling MyLocation in Google Map mGoogleMap.setMyLocationEnabled(true); // Getting LocationManager object from System Service LOCATION_SERVICE LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); // Creating a criteria object to retrieve provider Criteria criteria = new Criteria(); // Getting the name of the best provider String provider = locationManager.getBestProvider(criteria, true); // Getting Current Location From GPS Location location = locationManager.getLastKnownLocation(provider); if(location!=null){ onLocationChanged(location); } locationManager.requestLocationUpdates(provider, 20000, 0, this); mGoogleMap.setOnInfoWindowClickListener(new OnInfoWindowClickListener() { @Override public void onInfoWindowClick(Marker arg0) { Intent intent = new Intent(getBaseContext(), PlaceDetailsActivity.class); String reference = mMarkerPlaceLink.get(arg0.getId()); intent.putExtra("reference", reference); // Starting the Place Details Activity startActivity(intent); } }); // Setting click event lister for the find button btnFind.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { int selectedPosition = mSprPlaceType.getSelectedItemPosition(); String type = mPlaceType[selectedPosition]; StringBuilder sb = new StringBuilder("https://maps.googleapis.com/maps/api/place/nearbysearch/json?"); sb.append("location="+mLatitude+","+mLongitude); sb.append("&radius=5000"); sb.append("&types="+type); sb.append("&sensor=true"); sb.append("&key=AIzaSyCfdXATlz7jtM6MEvy9Xh_3_g_Ivc5ysXE"); // Creating a new non-ui thread task to download Google place json data PlacesTask placesTask = new PlacesTask(); // Invokes the "doInBackground()" method of the class PlaceTask placesTask.execute(sb.toString()); } }); } } /** 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; } /** A class, to download Google Places */ private class PlacesTask extends AsyncTask<String, Integer, String>{ String data = null; // Invoked by execute() method of this object @Override protected String doInBackground(String... url) { try{ data = downloadUrl(url[0]); }catch(Exception e){ Log.d("Background Task",e.toString()); } return data; } // Executed after the complete execution of doInBackground() method @Override protected void onPostExecute(String result){ ParserTask parserTask = new ParserTask(); // Start parsing the Google places in JSON format // Invokes the "doInBackground()" method of the class ParseTask parserTask.execute(result); } } /** A class to parse the Google Places in JSON format */ private class ParserTask extends AsyncTask<String, Integer, List<HashMap<String,String>>>{ JSONObject jObject; // Invoked by execute() method of this object @Override protected List<HashMap<String,String>> doInBackground(String... jsonData) { List<HashMap<String, String>> places = null; PlaceJSONParser placeJsonParser = new PlaceJSONParser(); try{ jObject = new JSONObject(jsonData[0]); /** Getting the parsed data as a List construct */ places = placeJsonParser.parse(jObject); }catch(Exception e){ Log.d("Exception",e.toString()); } return places; } // Executed after the complete execution of doInBackground() method @Override protected void onPostExecute(List<HashMap<String,String>> list){ // Clears all the existing markers mGoogleMap.clear(); for(int i=0;i <list.size();i++){ // Creating a marker MarkerOptions markerOptions = new MarkerOptions(); // Getting a place from the places list HashMap<String, String> hmPlace = list.get(i); // Getting latitude of the place double lat = Double.parseDouble(hmPlace.get("lat")); // Getting longitude of the place double lng = Double.parseDouble(hmPlace.get("lng")); // Getting name String name = hmPlace.get("place_name"); // Getting vicinity String vicinity = hmPlace.get("vicinity"); LatLng latLng = new LatLng(lat, lng); // Setting the position for the marker markerOptions.position(latLng); // Setting the title for the marker. //This will be displayed on taping the marker markerOptions.title(name + " : " + vicinity); // Placing a marker on the touched position Marker m = mGoogleMap.addMarker(markerOptions); // Linking Marker id and place reference mMarkerPlaceLink.put(m.getId(), hmPlace.get("reference")); } } } @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; } @Override public void onLocationChanged(Location location) { mLatitude = location.getLatitude(); mLongitude = location.getLongitude(); LatLng latLng = new LatLng(mLatitude, mLongitude); mGoogleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); mGoogleMap.animateCamera(CameraUpdateFactory.zoomTo(12)); } @Override public void onProviderDisabled(String provider) { // TODO Auto-generated method stub } @Override public void onProviderEnabled(String provider) { // TODO Auto-generated method stub } @Override public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub } }
1.) PlaceDetailsActivity.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 org.json.JSONObject; import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.webkit.WebView; public class PlaceDetailsActivity extends Activity { WebView mWvPlaceDetails; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_place_details); // Getting reference to WebView ( wv_place_details ) of the layout activity_place_details mWvPlaceDetails = (WebView) findViewById(R.id.wv_place_details); mWvPlaceDetails.getSettings().setUseWideViewPort(false); // Getting place reference from the map String reference = getIntent().getStringExtra("reference"); StringBuilder sb = new StringBuilder("https://maps.googleapis.com/maps/api/place/details/json?"); sb.append("reference="+reference); sb.append("&sensor=true"); sb.append("&key=AIzaSyCfdXATlz7jtM6MEvy9Xh_3_g_Ivc5ysXE"); // Creating a new non-ui thread task to download Google place details PlacesTask placesTask = new PlacesTask(); // Invokes the "doInBackground()" method of the class PlaceTask placesTask.execute(sb.toString()); }; /** 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; } /** A class, to download Google Place Details */ private class PlacesTask extends AsyncTask<String, Integer, String>{ String data = null; // Invoked by execute() method of this object @Override protected String doInBackground(String... url) { try{ data = downloadUrl(url[0]); }catch(Exception e){ Log.d("Background Task",e.toString()); } return data; } // Executed after the complete execution of doInBackground() method @Override protected void onPostExecute(String result){ ParserTask parserTask = new ParserTask(); // Start parsing the Google place details in JSON format // Invokes the "doInBackground()" method of the class ParseTask parserTask.execute(result); } } /** A class to parse the Google Place Details in JSON format */ private class ParserTask extends AsyncTask<String, Integer, HashMap<String,String>>{ JSONObject jObject; // Invoked by execute() method of this object @Override protected HashMap<String,String> doInBackground(String... jsonData) { HashMap<String, String> hPlaceDetails = null; PlaceDetailsJSONParser placeDetailsJsonParser = new PlaceDetailsJSONParser(); try{ jObject = new JSONObject(jsonData[0]); // Start parsing Google place details in JSON format hPlaceDetails = placeDetailsJsonParser.parse(jObject); }catch(Exception e){ Log.d("Exception",e.toString()); } return hPlaceDetails; } // Executed after the complete execution of doInBackground() method @Override protected void onPostExecute(HashMap<String,String> hPlaceDetails){ String name = hPlaceDetails.get("name"); String icon = hPlaceDetails.get("icon"); String vicinity = hPlaceDetails.get("vicinity"); String lat = hPlaceDetails.get("lat"); String lng = hPlaceDetails.get("lng"); String formatted_address = hPlaceDetails.get("formatted_address"); String formatted_phone = hPlaceDetails.get("formatted_phone"); String website = hPlaceDetails.get("website"); String rating = hPlaceDetails.get("rating"); String international_phone_number = hPlaceDetails.get("international_phone_number"); String url = hPlaceDetails.get("url"); String mimeType = "text/html"; String encoding = "utf-8"; String data = ""+ "<img style="float: left;" src="+icon+" alt="" /> <center>"+name+"</center>" + "<br style="clear: both;" />" + " <hr /> "+ " Vicinity : " + vicinity + " " + " Location : " + lat + "," + lng + " " + " Address : " + formatted_address + " " + " Phone : " + formatted_phone + " " + " Website : " + website + " " + " Rating : " + rating + " " + " International Phone : " + international_phone_number + " " + " URL : <a href="" + url + "">" + url + "</a> " + " "; // Setting the data in WebView mWvPlaceDetails.loadDataWithBaseURL("", data, mimeType, encoding, ""); } } } 2.) PlaceDetailsJSONParser.java package com.mapv2.demo; import java.util.HashMap; import org.json.JSONException; import org.json.JSONObject; public class PlaceDetailsJSONParser { /** Receives a JSONObject and returns a list */ public HashMap<String,String> parse(JSONObject jObject){ JSONObject jPlaceDetails = null; try { /** Retrieves all the elements in the 'places' array */ jPlaceDetails = jObject.getJSONObject("result"); } catch (JSONException e) { e.printStackTrace(); } /** Invoking getPlaces with the array of json object * where each json object represent a place */ return getPlaceDetails(jPlaceDetails); } /** Parsing the Place Detai12ls Object object */ private HashMap<String, String> getPlaceDetails(JSONObject jPlaceDetails){ HashMap<String, String> hPlaceDetails = new HashMap<String, String>(); String name = "-NA-"; String icon = "-NA-"; String vicinity="-NA-"; String latitude=""; String longitude=""; String formatted_address="-NA-"; String formatted_phone="-NA-"; String website="-NA-"; String rating="-NA-"; String international_phone_number="-NA-"; String url="-NA-"; try { // Extracting Place name, if available if(!jPlaceDetails.isNull("name")){ name = jPlaceDetails.getString("name"); } // Extracting Icon, if available if(!jPlaceDetails.isNull("icon")){ icon = jPlaceDetails.getString("icon"); } // Extracting Place Vicinity, if available if(!jPlaceDetails.isNull("vicinity")){ vicinity = jPlaceDetails.getString("vicinity"); } // Extracting Place formatted_address, if available if(!jPlaceDetails.isNull("formatted_address")){ formatted_address = jPlaceDetails.getString("formatted_address"); } // Extracting Place formatted_phone, if available if(!jPlaceDetails.isNull("formatted_phone_number")){ formatted_phone = jPlaceDetails.getString("formatted_phone_number"); } // Extracting website, if available if(!jPlaceDetails.isNull("website")){ website = jPlaceDetails.getString("website"); } // Extracting rating, if available if(!jPlaceDetails.isNull("rating")){ rating = jPlaceDetails.getString("rating"); } // Extracting rating, if available if(!jPlaceDetails.isNull("international_phone_number")){ international_phone_number = jPlaceDetails.getString("international_phone_number"); } // Extracting url, if available if(!jPlaceDetails.isNull("url")){ url = jPlaceDetails.getString("url"); } latitude = jPlaceDetails.getJSONObject("geometry").getJSONObject("location").getString("lat"); longitude = jPlaceDetails.getJSONObject("geometry").getJSONObject("location").getString("lng"); hPlaceDetails.put("name", name); hPlaceDetails.put("icon", icon); hPlaceDetails.put("vicinity", vicinity); hPlaceDetails.put("lat", latitude); hPlaceDetails.put("lng", longitude); hPlaceDetails.put("formatted_address", formatted_address); hPlaceDetails.put("formatted_phone", formatted_phone); hPlaceDetails.put("website", website); hPlaceDetails.put("rating", rating); hPlaceDetails.put("international_phone_number", international_phone_number); hPlaceDetails.put("url", url); } catch (JSONException e) { e.printStackTrace(); } return hPlaceDetails; } }
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("results"); } 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 placeName = "-NA-"; String vicinity="-NA-"; String latitude=""; String longitude=""; String reference=""; try { // Extracting Place name, if available if(!jPlace.isNull("name")){ placeName = jPlace.getString("name"); } // Extracting Place Vicinity, if available if(!jPlace.isNull("vicinity")){ vicinity = jPlace.getString("vicinity"); } latitude = jPlace.getJSONObject("geometry").getJSONObject("location").getString("lat"); longitude = jPlace.getJSONObject("geometry").getJSONObject("location").getString("lng"); reference = jPlace.getString("reference"); place.put("place_name", placeName); place.put("vicinity", vicinity); place.put("lat", latitude); place.put("lng", longitude); place.put("reference", reference); } catch (JSONException e) { e.printStackTrace(); } return place; } }
Step 6 :- Run Code.
please provide the full source code. for Showing nearby places and place details using Google Places API and Google Maps Android API V2….