Create a new class namely “DirectionsJSONParser” in the file src/in/wptrafficanalyzer/locationroutedirectionmapv2/DirectionsJSONParser.java
package
in.wptrafficanalyzer.locationroutedirectionmapv2;
import
java.util.ArrayList;
import
java.util.HashMap;
import
java.util.List;
import
org.json.JSONArray;
import
org.json.JSONException;
import
org.json.JSONObject;
import
com.google.android.gms.maps.model.LatLng;
public
class
DirectionsJSONParser {
/** Receives a JSONObject and returns a list of lists containing latitude and longitude */
public
List<List<HashMap<String,String>>> parse(JSONObject jObject){
List<List<HashMap<String, String>>> routes =
new
ArrayList<List<HashMap<String,String>>>() ;
JSONArray jRoutes =
null
;
JSONArray jLegs =
null
;
JSONArray jSteps =
null
;
try
{
jRoutes = jObject.getJSONArray(
"routes"
);
/** Traversing all routes */
for
(
int
i=
0
;i<jRoutes.length();i++){
jLegs = ( (JSONObject)jRoutes.get(i)).getJSONArray(
"legs"
);
List path =
new
ArrayList<HashMap<String, String>>();
/** Traversing all legs */
for
(
int
j=
0
;j<jLegs.length();j++){
jSteps = ( (JSONObject)jLegs.get(j)).getJSONArray(
"steps"
);
/** Traversing all steps */
for
(
int
k=
0
;k<jSteps.length();k++){
String polyline =
""
;
polyline = (String)((JSONObject)((JSONObject)jSteps.get(k)).get(
"polyline"
)).get(
"points"
);
List<LatLng> list = decodePoly(polyline);
/** Traversing all points */
for
(
int
l=
0
;l<list.size();l++){
HashMap<String, String> hm =
new
HashMap<String, String>();
hm.put(
"lat"
, Double.toString(((LatLng)list.get(l)).latitude) );
hm.put(
"lng"
, Double.toString(((LatLng)list.get(l)).longitude) );
path.add(hm);
}
}
routes.add(path);
}
}
}
catch
(JSONException e) {
e.printStackTrace();
}
catch
(Exception e){
}
return
routes;
}
/**
* Method to decode polyline points
* */
private
List<LatLng> decodePoly(String encoded) {
List<LatLng> poly =
new
ArrayList<LatLng>();
int
index =
0
, len = encoded.length();
int
lat =
0
, lng =
0
;
while
(index < len) {
int
b, shift =
0
, result =
0
;
do
{
b = encoded.charAt(index++) -
63
;
result |= (b &
0x1f
) << shift;
shift +=
5
;
}
while
(b >=
0x20
);
int
dlat = ((result &
1
) !=
0
? ~(result >>
1
) : (result >>
1
));
lat += dlat;
shift =
0
;
result =
0
;
do
{
b = encoded.charAt(index++) -
63
;
result |= (b &
0x1f
) << shift;
shift +=
5
;
}
while
(b >=
0x20
);
int
dlng = ((result &
1
) !=
0
? ~(result >>
1
) : (result >>
1
));
lng += dlng;
LatLng p =
new
LatLng((((
double
) lat / 1E5)),
(((
double
) lng / 1E5)));
poly.add(p);
}
return
poly;
}
}
Update the class “MainActivity” in the file src/in/wptrafficanalyzer/locationroutedirectionmapv2/MainActivity.java
package
in.wptrafficanalyzer.locationroutedirectionmapv2;
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.ArrayList;
import
java.util.HashMap;
import
java.util.List;
import
org.json.JSONObject;
import
android.graphics.Color;
import
android.os.AsyncTask;
import
android.os.Bundle;
import
android.support.v4.app.FragmentActivity;
import
android.util.Log;
import
android.view.Menu;
import
com.google.android.gms.maps.GoogleMap;
import
com.google.android.gms.maps.GoogleMap.OnMapClickListener;
import
com.google.android.gms.maps.SupportMapFragment;
import
com.google.android.gms.maps.model.BitmapDescriptorFactory;
import
com.google.android.gms.maps.model.LatLng;
import
com.google.android.gms.maps.model.MarkerOptions;
import
com.google.android.gms.maps.model.PolylineOptions;
public
class
MainActivity
extends
FragmentActivity {
GoogleMap map;
ArrayList<LatLng> markerPoints;
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
markerPoints =
new
ArrayList<LatLng>();
SupportMapFragment fm = (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map);
map = fm.getMap();
if
(map!=
null
){
map.setMyLocationEnabled(
true
);
map.setOnMapClickListener(
new
OnMapClickListener() {
@Override
public
void
onMapClick(LatLng point) {
if
(markerPoints.size()>
1
){
markerPoints.clear();
map.clear();
}
markerPoints.add(point);
MarkerOptions options =
new
MarkerOptions();
options.position(point);
/**
* For the start location, the color of marker is GREEN and
* for the end location, the color of marker is RED.
*/
if
(markerPoints.size()==
1
){
options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN));
}
else
if
(markerPoints.size()==
2
){
options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED));
}
map.addMarker(options);
if
(markerPoints.size() >=
2
){
LatLng origin = markerPoints.get(
0
);
LatLng dest = markerPoints.get(
1
);
String url = getDirectionsUrl(origin, dest);
DownloadTask downloadTask =
new
DownloadTask();
downloadTask.execute(url);
}
}
});
}
}
private
String getDirectionsUrl(LatLng origin,LatLng dest){
String str_origin =
"origin="
+origin.latitude+
","
+origin.longitude;
String str_dest =
"destination="
+dest.latitude+
","
+dest.longitude;
String sensor =
"sensor=false"
;
String parameters = str_origin+
"&"
+str_dest+
"&"
+sensor;
String output =
"json"
;
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);
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.connect();
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;
}
private
class
DownloadTask
extends
AsyncTask<String, Void, String>{
@Override
protected
String doInBackground(String... url) {
String data =
""
;
try
{
data = downloadUrl(url[
0
]);
}
catch
(Exception e){
Log.d(
"Background Task"
,e.toString());
}
return
data;
}
@Override
protected
void
onPostExecute(String result) {
super
.onPostExecute(result);
ParserTask parserTask =
new
ParserTask();
parserTask.execute(result);
}
}
/** A class to parse the Google Places in JSON format */
private
class
ParserTask
extends
AsyncTask<String, Integer, List<List<HashMap<String,String>>> >{
@Override
protected
List<List<HashMap<String, String>>> doInBackground(String... jsonData) {
JSONObject jObject;
List<List<HashMap<String, String>>> routes =
null
;
try
{
jObject =
new
JSONObject(jsonData[
0
]);
DirectionsJSONParser parser =
new
DirectionsJSONParser();
routes = parser.parse(jObject);
}
catch
(Exception e){
e.printStackTrace();
}
return
routes;
}
@Override
protected
void
onPostExecute(List<List<HashMap<String, String>>> result) {
ArrayList<LatLng> points =
null
;
PolylineOptions lineOptions =
null
;
MarkerOptions markerOptions =
new
MarkerOptions();
for
(
int
i=
0
;i<result.size();i++){
points =
new
ArrayList<LatLng>();
lineOptions =
new
PolylineOptions();
List<HashMap<String, String>> path = result.get(i);
for
(
int
j=
0
;j<path.size();j++){
HashMap<String,String> point = path.get(j);
double
lat = Double.parseDouble(point.get(
"lat"
));
double
lng = Double.parseDouble(point.get(
"lng"
));
LatLng position =
new
LatLng(lat, lng);
points.add(position);
}
lineOptions.addAll(points);
lineOptions.width(
2
);
lineOptions.color(Color.RED);
}
map.addPolyline(lineOptions);
}
}
@Override
public
boolean
onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return
true
;
}
}
Update the file AndroidManifest.xml
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
package
=
"in.wptrafficanalyzer.locationroutedirectionmapv2"
android:versionCode
=
"1"
android:versionName
=
"1.0"
>
<
uses-sdk
android:minSdkVersion
=
"8"
android:targetSdkVersion
=
"17"
/>
<
uses-permission
android:name
=
"android.permission.INTERNET"
/>
<
permission
android:name
=
"in.wptrafficanalyzer.locationroutedirectionmapv2.permission.MAPS_RECEIVE"
android:protectionLevel
=
"signature"
/>
<
uses-permission
android:name
=
"in.wptrafficanalyzer.locationroutedirectionmapv2.permission.MAPS_RECEIVE"
/>
<
uses-permission
android:name
=
"android.permission.INTERNET"
/>
<
uses-permission
android:name
=
"android.permission.WRITE_EXTERNAL_STORAGE"
/>
<
uses-permission
android:name
=
"com.google.android.providers.gsf.permission.READ_GSERVICES"
/>
<
uses-permission
android:name
=
"android.permission.ACCESS_COARSE_LOCATION"
/>
<
uses-permission
android:name
=
"android.permission.ACCESS_FINE_LOCATION"
/>
<
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
=
"in.wptrafficanalyzer.locationroutedirectionmapv2.MainActivity"
android:label
=
"@string/app_name"
>
<
intent-filter
>
<
action
android:name
=
"android.intent.action.MAIN"
/>
<
category
android:name
=
"android.intent.category.LAUNCHER"
/>
</
intent-filter
>
</
activity
>
<
meta-data
android:name
=
"com.google.android.maps.v2.API_KEY"
android:value
=
"YOUR_API_KEY"
/>
</
application
>
</
manifest
>
Replace “YOUR_API_KEY” at the line 46 with the API key obtained from Api Console