• Tutorials
  • Tips & Tricks
  • Applications
  • News

Android Trainee

  • Tutorials
  • Tips & Tricks
  • Applications
  • News
Home  /  Tutorials  /  Showing nearby places and place details using Google Places API and Google Maps Android API V2
21 November 2014

Showing nearby places and place details using Google Places API and Google Maps Android API V2

Written by admin@androidtrainee
Tutorials android, Android App, androidmapv2, google place api, location, map, mapv2, mapv2 api, touched location 1 Comment

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" &gt;

&lt;uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" /&gt;

&lt;permission
android:name="com.mapv2.demo.permission.MAPS_RECEIVE"
android:protectionLevel="signature"/&gt;

&nbsp;

&nbsp;

&lt;uses-feature
android:glEsVersion="0x00020000"
android:required="true"/&gt;

&lt;application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" &gt;
&lt;activity
android:name="com.mapv2.demo.MainActivity"
android:label="@string/app_name" &gt;
&nbsp;

&lt;activity
android:name="com.mapv2.demo.PlaceDetailsActivity"
android:label="@string/app_name" &gt;



&lt;meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="AIzaSyCmX7SLVHXxU9pSqb2QbAOvdnjAGUulOrk"/&gt;

&nbsp;

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" &gt;

&lt;WebView
android:id="@+id/wv_place_details"
android:layout_width="fill_parent"
android:layout_height="match_parent" /&gt;

&nbsp;

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("&amp;sensor=true");
sb.append("&amp;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&lt;String, Integer, String&gt;{

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&lt;String, Integer, HashMap&lt;String,String&gt;&gt;{

JSONObject jObject;

// Invoked by execute() method of this object
@Override
protected HashMap&lt;String,String&gt; doInBackground(String... jsonData) {

HashMap&lt;String, String&gt; 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&lt;String,String&gt; 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="&quot; + url + &quot;">" + url + "</a>

" +
"

";

&nbsp;

// 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&lt;String,String&gt; 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&lt;String, String&gt; getPlaceDetails(JSONObject jPlaceDetails){

HashMap&lt;String, String&gt; hPlaceDetails = new HashMap&lt;String, String&gt;();

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.

admin@androidtrainee

 Previous Article Android Reverse Geocoding at touched location in Google Map Android API V2
Next Article   Retain markers on screen rotation in Google Maps Android API V2 using Parcelable LatLng points

Related Posts

  • Android New Quick Action Animation.

    July 15, 2015
  • Android satellite menu Animation.

    July 15, 2015
  • Android Staggered Grid & List View.

    July 14, 2015

1 Comment

  1. chaitali Reply to chaitali
    April 5, 2016 at 12:52 pm

    please provide the full source code. for Showing nearby places and place details using Google Places API and Google Maps Android API V2….

Leave a Reply to chaitali Cancel reply

Tags

admob Advertising Networks AerServ Airpush android android ads android Advertising Networks Android App android chart animation Android GridView android L android lollipop androidmapv2 AppBrain AppFlood Appia AppKey Appnext AppOptim Appwiz chart chartview Epom Market google place api GridView Image Loader InMobi LeadBolt location map mapv2 mapv2 api material design Minimob Mobicow MobileCore MobiMicro NativeX Pingjam RevMob StarApplication startapp TapContext touched location Widdit

Count per Day

  • 347Reads yesterday:
  • 463874Total visitors:
  • 94Visitors today:
  • 2467Visitors per month:
  • 2Visitors currently online:
© Copyright 2014. Theme by BloomPixel.
Posting....