title: travel time between two locations in Google Map Android API V2
body: <p>how to display travel time between two locations in Google Map Android API V2,
  in my program i using JSONParse to display driving distance, but i'm can't to display the display travel time, This example program I made: DirectionActivity.java</p>
  
  <pre><code>public class DirectionActivity extends FragmentActivity implements OnMyLocationChangeListener{
  
  private LatLng          start;
  private LatLng          end;
  private String          nama;
  private final String    URL = "http://maps.googleapis.com/maps/api/directions/json?";
  private GoogleMap       map;
  private JSONHelper      json;
  private ProgressDialog  pDialog;
  private List&lt;LatLng&gt;    listDirections;
  
  @Override
  protected void onCreate(Bundle savedInstanceState)
  {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_direction);
      json = new JSONHelper();
      setupMapIfNeeded();
  
      Bundle b = getIntent().getExtras();
      if (b != null)
      {
          start = new LatLng(b.getDouble(MainActivity.KEY_LAT_ASAL), b.getDouble(MainActivity.KEY_LNG_ASAL));
          end = new LatLng(b.getDouble(MainActivity.KEY_LAT_TUJUAN), b.getDouble(MainActivity.KEY_LNG_TUJUAN));
          nama = b.getString(MainActivity.KEY_NAMA);
      }
  
      new AsyncTaskDirection().execute();
  }
  
  private void setupMapIfNeeded()
  {
      if (map == null)
      {
          FragmentManager fragmentManager = getSupportFragmentManager();
          SupportMapFragment supportMapFragment = (SupportMapFragment) fragmentManager
                  .findFragmentById(R.id.mapsdirections);
          map = supportMapFragment.getMap();
  
          if (map != null)
          {
              setupMap();
          }
      }
  
  }
  
  private void setupMap()
  {
      map.setMyLocationEnabled(true);
      map.setOnMyLocationChangeListener(this);
      moveToMyLocation();
  }
  
  private void moveToMyLocation()
  {
      LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
      Criteria criteria = new Criteria();
  
      Location location = locationManager.getLastKnownLocation(locationManager.getBestProvider(criteria, false));
      if (location != null)
      {
          map.animateCamera(CameraUpdateFactory.newLatLngZoom(
                  new LatLng(location.getLatitude(), location.getLongitude()), 13));
      }
  }
  
  @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
  protected void onResume()
  {
      // TODO Auto-generated method stub
      super.onResume();
      int resCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext());
      if (resCode != ConnectionResult.SUCCESS)
      {
          GooglePlayServicesUtil.getErrorDialog(resCode, this, 1);
      }
  }
  
  private class AsyncTaskDirection extends AsyncTask&lt;Void, Void, Void&gt;
  {
      @Override
      protected Void doInBackground(Void... params)
      {
          String uri = URL
                  + "origin=" + start.latitude + "," + start.longitude
                  + "&amp;destination=" + end.latitude + "," + end.longitude
                  + "&amp;sensor=true&amp;units=metric";
  
          JSONObject jObject = json.getJSONFromURL(uri);
          listDirections = json.getDirection(jObject);
  
          return null;
      }
  
      @Override
      protected void onPreExecute()
      {
          // TODO Auto-generated method stub
          super.onPreExecute();
          pDialog = new ProgressDialog(DirectionActivity.this);
          pDialog.setMessage("Loading....");
          pDialog.setCancelable(true);
          pDialog.show();
      }
  
      @Override
      protected void onPostExecute(Void result)
      {
          // TODO Auto-generated method stub
          super.onPostExecute(result);
          pDialog.dismiss();
          gambarDirection();
      }
  
  }
  
  public void gambarDirection()
  {
      PolylineOptions line = new PolylineOptions().width(3).color(Color.BLUE);
      for (int i = 0; i &lt; listDirections.size(); i++)
      {
          line.add(listDirections.get(i));
      }
      map.addPolyline(line);
  
      // tambah marker di posisi end
      map.addMarker(new MarkerOptions()
              .position(end)
              .title(nama));
  }
  
  @Override
  public void onMyLocationChange(Location location)
  {
      Toast.makeText(this, "Lokasi berubah ke " + location.getLatitude() + "," + location.getLongitude(),
              Toast.LENGTH_SHORT).show();
  
  }
  
  }
  </code></pre>
  
  <p>JSONHelper.java</p>
  
  <pre><code>public class JSONHelper
  {
  private InputStream     is              = null;
  private JSONObject      jsonObject      = null;
  private String          json            = "";
  
  private final String    TAG_TEMPATMAKAN = "tempatmakan";
  private final String    TAG_ID          = "id";
  private final String    TAG_NAMA        = "nama";
  private final String    TAG_ALAMAT      = "alamat";
  private final String    TAG_LAT         = "lat";
  private final String    TAG_LNG         = "lng";
  private final String    TAG_ROUTES      = "routes";
  private final String    TAG_LEGS        = "legs";
  private final String    TAG_STEPS       = "steps";
  private final String    TAG_POLYLINE    = "polyline";
  private final String    TAG_POINTS      = "points";
  private final String    TAG_START       = "start_location";
  private final String    TAG_END         = "end_location";
  
  public JSONObject getJSONFromURL(String url)
  {
      try
      {
          DefaultHttpClient httpClient = new DefaultHttpClient();
          HttpGet httpGet = new HttpGet(url);
  
          HttpResponse httpResponse = httpClient.execute(httpGet);
          HttpEntity httpEntity = httpResponse.getEntity();
          is = httpEntity.getContent();
      } catch (UnsupportedEncodingException e)
      {
          e.printStackTrace();
      } catch (ClientProtocolException e)
      {
          e.printStackTrace();
      } catch (IOException e)
      {
          e.printStackTrace();
      }
  
      try
      {
          BufferedReader reader = new BufferedReader(new InputStreamReader(
                  is, "iso-8859-1"), 8);
  
          StringBuilder sb = new StringBuilder();
          String line = null;
  
          while ((line = reader.readLine()) != null)
          {
              sb.append(line + "\n");
          }
  
          is.close();
          json = sb.toString();
      } catch (Exception e)
      {
          // TODO: handle exception
      }
  
      try
      {
          jsonObject = new JSONObject(json);
  
      } catch (JSONException e)
      {
          // TODO: handle exception
      }
  
      return jsonObject;
  }
  
  public ArrayList&lt;TempatMakan&gt; getTempatMakanAll(JSONObject jobj)
  {
      ArrayList&lt;TempatMakan&gt; listTempatMakan = new ArrayList&lt;TempatMakan&gt;();
  
      try
      {
          JSONArray arrayTempatMakan = jobj.getJSONArray(TAG_TEMPATMAKAN);
  
          for (int i = 0; i &lt; arrayTempatMakan.length(); i++)
          {
              JSONObject jobject = arrayTempatMakan.getJSONObject(i);
  
              Log.d("log", "muter ke " + i);
              listTempatMakan.add(new TempatMakan(jobject.getInt(TAG_ID), jobject.getString(TAG_NAMA), jobject
                      .getString(TAG_ALAMAT), jobject
                      .getDouble(TAG_LAT), jobject.getDouble(TAG_LNG)));
  
          }
      } catch (JSONException e)
      {
          e.printStackTrace();
      }
      return listTempatMakan;
  }
  
  /*
   * Untuk decode Polyline
   * 
   * @params String
   * 
   * @return List&lt;LatLng&gt;
   */
  private List&lt;LatLng&gt; decodePoly(String encoded)
  {
      List&lt;LatLng&gt; poly = new ArrayList&lt;LatLng&gt;();
      int index = 0, len = encoded.length();
      int lat = 0, lng = 0;
      while (index &lt; len)
      {
          int b, shift = 0, result = 0;
          do
          {
              b = encoded.charAt(index++) - 63;
              result |= (b &amp; 0x1f) &lt;&lt; shift;
              shift += 5;
          } while (b &gt;= 0x20);
          int dlat = ((result &amp; 1) != 0 ? ~(result &gt;&gt; 1) : (result &gt;&gt; 1));
          lat += dlat;
          shift = 0;
          result = 0;
          do
          {
              b = encoded.charAt(index++) - 63;
              result |= (b &amp; 0x1f) &lt;&lt; shift;
              shift += 5;
          } while (b &gt;= 0x20);
          int dlng = ((result &amp; 1) != 0 ? ~(result &gt;&gt; 1) : (result &gt;&gt; 1));
          lng += dlng;
  
          LatLng position = new LatLng((double) lat / 1E5, (double) lng / 1E5);
          poly.add(position);
      }
      return poly;
  
  }
  
  /*
   * Untuk mendapatkan direction
   * 
   * @params JSONObject
   * 
   * @return List&lt;LatLng&gt;
   */
  public List&lt;LatLng&gt; getDirection(JSONObject jObj)
  {
  
      List&lt;LatLng&gt; directions = new ArrayList&lt;LatLng&gt;();
  
      try
      {
          JSONObject objRoute = jObj.getJSONArray(TAG_ROUTES).getJSONObject(0);
          JSONObject objLegs = objRoute.getJSONArray(TAG_LEGS).getJSONObject(0);
          JSONArray arraySteps = objLegs.getJSONArray(TAG_STEPS);
          for (int wi2t = 0; wi2t &lt; arraySteps.length(); wi2t++)
          {
              JSONObject step = arraySteps.getJSONObject(wi2t);
              JSONObject objStart = step.getJSONObject(TAG_START);
              JSONObject objEnd = step.getJSONObject(TAG_END);
              double latStart = objStart.getDouble(TAG_LAT);
              double lngStart = objStart.getDouble(TAG_LNG);
  
              directions.add(new LatLng(latStart, lngStart));
  
              JSONObject poly = step.getJSONObject(TAG_POLYLINE);
              String encodedPoly = poly.getString(TAG_POINTS);
  
              List&lt;LatLng&gt; decodedPoly = decodePoly(encodedPoly);
              for (int eka = 0; eka &lt; decodedPoly.size(); eka++)
              {
                  directions.add(new LatLng(decodedPoly.get(eka).latitude, decodedPoly.get(eka).longitude));
              }
  
              double latEnd = objEnd.getDouble(TAG_LAT);
              double lngEnd = objEnd.getDouble(TAG_LNG);
              directions.add(new LatLng(latEnd, lngEnd));
  
          }
      } catch (JSONException e)
      {
          // TODO: handle exception
      }
  
      return directions;
  }
  }
  </code></pre>
  
  <p>MainActivity.java</p>
  
  <pre><code>public class MainActivity extends FragmentActivity implements OnInfoWindowClickListener
  {
  private GoogleMap           map;
  private JSONHelper          json;
  private ProgressDialog      pDialog;
  private Button      btnGetDirection;
  
  private List&lt;TempatMakan&gt;   listTempatMakan;
  private final String        URL_API     = "http://lhocation1203.hostzi.com/dataapi/tempatmakan.php";
  
  public static final String  KEY_NAMA    = "nama";
  public static final String  KEY_ALAMAT  = "alamat";
  public static final String  KEY_LAT_TUJUAN  = "lat_tujuan";
  public static final String  KEY_LNG_TUJUAN  = "lng_tujuan";
  public static final String  KEY_LAT_ASAL    = "lat_asal";
  public static final String  KEY_LNG_ASAL    = "lng_asal";
  
  @Override
  protected void onCreate(Bundle savedInstanceState)
  {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      json = new JSONHelper();
  
      new AsynTaskMain().execute();
  
      setupMapIfNeeded();
  }
  
  private void setupMapIfNeeded()
  {
      if (map == null)
      {
          FragmentManager fragmentManager = getSupportFragmentManager();
          SupportMapFragment supportMapFragment = (SupportMapFragment) fragmentManager.findFragmentById(R.id.maps);
          map = supportMapFragment.getMap();
  
          if (map != null)
          {
              setupMap();
          }
      }
  
  }
  
  private void setupMap()
  {
      map.setMyLocationEnabled(true);
      map.setOnInfoWindowClickListener(this);
      moveToMyLocation();
  }
  
  private void moveToMyLocation()
  {
      LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
      Criteria criteria = new Criteria();
  
      Location location = locationManager.getLastKnownLocation(locationManager.getBestProvider(criteria, false));
      if (location != null)
      {
          map.animateCamera(CameraUpdateFactory.newLatLngZoom(
                  new LatLng(location.getLatitude(), location.getLongitude()), 13));
      }
  }
  
  @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
  protected void onResume()
  {
      // TODO Auto-generated method stub
      super.onResume();
  
      int resCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext());
      if (resCode != ConnectionResult.SUCCESS)
      {
          GooglePlayServicesUtil.getErrorDialog(resCode, this, 1);
      }
  }
  
  private class AsynTaskMain extends AsyncTask&lt;Void, Void, Void&gt;
  {
  
      @Override
      protected void onPostExecute(Void result)
      {
          // TODO Auto-generated method stub
          pDialog.dismiss();
          runOnUiThread(new Runnable()
          {
  
              @Override
              public void run()
              {
                  // TODO Auto-generated method stub
                  for (int i = 0; i &lt; listTempatMakan.size(); i++)
                  {
  
                      map.addMarker(new MarkerOptions()
                              .position(new LatLng(listTempatMakan.get(i).getLat(),
                                      listTempatMakan.get(i).getLng()))
                              .title(listTempatMakan.get(i).getNama())
                              .snippet(listTempatMakan.get(i).getAlamat()));
  
                  }
              }
          });
  
          super.onPostExecute(result);
      }
  
      @Override
      protected void onPreExecute()
      {
          // TODO Auto-generated method stub
          super.onPreExecute();
          pDialog = new ProgressDialog(MainActivity.this);
          pDialog.setMessage("Loading....");
          pDialog.setCancelable(true);
          pDialog.show();
      }
  
      @Override
      protected Void doInBackground(Void... params)
      {
          // TODO Auto-generated method stub
  
          JSONObject jObject = json.getJSONFromURL(URL_API);
          listTempatMakan = json.getTempatMakanAll(jObject);
          return null;
      }
  }
  
  @Override
  public void onInfoWindowClick(Marker marker)
  {
      // marker id -&gt; m0, m1, m2 dst..
      String id = marker.getId();
      id = id.substring(1);
  
      LatLng myLocation = new LatLng(map.getMyLocation().getLatitude(), map.getMyLocation().getLongitude());
  
      if (myLocation != null)
      {
          Bundle bundle = new Bundle();
          bundle.putString(KEY_NAMA, listTempatMakan.get(Integer.parseInt(id)).getNama());
          bundle.putString(KEY_ALAMAT, listTempatMakan.get(Integer.parseInt(id)).getAlamat());
          bundle.putDouble(KEY_LAT_TUJUAN, marker.getPosition().latitude);
          bundle.putDouble(KEY_LNG_TUJUAN, marker.getPosition().longitude);
          bundle.putDouble(KEY_LAT_ASAL, myLocation.latitude);
          bundle.putDouble(KEY_LNG_ASAL, myLocation.longitude);
  
          Intent i = new Intent(MainActivity.this, InfoTempatMakanActivity.class);
          i.putExtras(bundle);
          startActivity(i);
  
      } else
      {
          Toast.makeText(this, "Tidak dapat menemukan lokasi anda ", Toast.LENGTH_LONG).show();
      }
  }
  }
  </code></pre>
  
  <p>InfoTempatMakanActivity.java</p>
  
  <pre><code>public class InfoTempatMakanActivity extends Activity implements OnClickListener
  {
  
  private TextView    tvNama;
  private TextView    tvAlamat;
  private Button      btnGetDirection;
  
  private LatLng      lokasiTujuan;
  private LatLng      lokasiAwal;
  private String      nama;
  private String      alamat;
  
  @Override
  protected void onCreate(Bundle savedInstanceState)
  {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_info_tempat_makan);
  
      initialize();
  
      Bundle bundle = getIntent().getExtras();
      if (bundle != null)
      {
          nama = bundle.getString(MainActivity.KEY_NAMA);
          alamat = bundle.getString(MainActivity.KEY_ALAMAT);
          lokasiTujuan = new LatLng(bundle.getDouble(MainActivity.KEY_LAT_TUJUAN),
                  bundle.getDouble(MainActivity.KEY_LNG_TUJUAN));
          lokasiAwal = new LatLng(bundle.getDouble(MainActivity.KEY_LAT_ASAL),
                  bundle.getDouble(MainActivity.KEY_LNG_ASAL));
      }
  
      setTeksView();
  
  }
  
  private void setTeksView()
  {
      tvNama.setText(nama);
      tvAlamat.setText(alamat);
  }
  
  private void initialize()
  {
      tvAlamat = (TextView) findViewById(R.id.alamatTempatMakan);
      tvNama = (TextView) findViewById(R.id.namaTempatMakan);
      btnGetDirection = (Button) findViewById(R.id.btnDirection);
      btnGetDirection.setOnClickListener(this);
  }
  
  @Override
  public void onClick(View v)
  {
      Bundle bundle = new Bundle();
      bundle.putDouble(MainActivity.KEY_LAT_ASAL, lokasiAwal.latitude);
      bundle.putDouble(MainActivity.KEY_LNG_ASAL, lokasiAwal.longitude);
      bundle.putDouble(MainActivity.KEY_LAT_TUJUAN, lokasiTujuan.latitude);
      bundle.putDouble(MainActivity.KEY_LNG_TUJUAN, lokasiTujuan.longitude);
      bundle.putString(MainActivity.KEY_NAMA, nama);
  
      Intent intent = new Intent(this, DirectionActivity.class);
      intent.putExtras(bundle);
  
      startActivity(intent);
  }
  
  }
  </code></pre>
  
  <p>TempatMakan.java</p>
  
  <pre><code>public class TempatMakan
  {
  private int id;
  private String  nama;
  private String  alamat;
  private double  lat;
  private double  lng;
  
  public TempatMakan()
  {
      // TODO Auto-generated constructor stub
  }
  
  public TempatMakan(int id, String nama, String alamat, double lat, double lng)
  {
      super();
              this.id = id;
      this.nama = nama;
      this.alamat = alamat;
      this.lat = lat;
      this.lng = lng;
  }
  
  public String getNama()
  {
      return nama;
  }
  
  public void setNama(String nama)
  {
      this.nama = nama;
  }
  
  public String getAlamat()
  {
      return alamat;
  }
  
  public void setAlamat(String alamat)
  {
      this.alamat = alamat;
  }
  
  public double getLat()
  {
      return lat;
  }
  
  public void setLat(double lat)
  {
      this.lat = lat;
  }
  
  public double getLng()
  {
      return lng;
  }
  
  public void setLng(double lng)
  {
      this.lng = lng;
  }
  
  }
  </code></pre>