title: Android- Google Maps V2 : Trace route from current position to an other destination
body: <p>I started with this example, to draw a route between 2 address, type by the user. It is working. <a href="http://blog.rolandl.fr/1357-android-des-itineraires-dans-vos-applications-grace-a-lapi-google-direction" rel="nofollow">http://blog.rolandl.fr/1357-android-des-itineraires-dans-vos-applications-grace-a-lapi-google-direction</a></p>
  
  <p>But now I would like to draw a route from my current position to an other destination, type by the user.
  My problem is that I don't know how to retrieve the current position, in this case. 
  I've tried to do :</p>
  
  <pre><code>LocationManager locationmanager=(LocationManager)this.getSystemService(LOCATION_SERVICE);
  final double longitude=locationmanager.getLongitude();
  final double latitude=locationmanager.getLatitude();
  </code></pre>
  
  <p>But it will not work... I think I am mixing every example I've found, and it is not good at all.</p>
  
  <p>Can you please help me ?</p>
  
  <p>Here is my <strong>MapActivity</strong> :
  Receiving 2 address typed by the user in my MainActivity
      public class MapActivity extends Activity implements LocationListener
      {
          private GoogleMap googlemap;</p>
  
  <pre><code>    protected void onCreate(final Bundle savedInstanceState) 
      {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_map);
  
          // Recuperation des composants graphiques
          googlemap = ((MapFragment)getFragmentManager().findFragmentById(R.id.map)).getMap();
  
          //Recuperations des adresses depart-arrivee
          // RETRIEVE DEPARTURE AND DESTINATION ADDRESS
          /*
           * For editDepart, I would like to replace it by my Current location
           */
          final String editDepart = getIntent().getStringExtra("DEPART");
          final String editArrivee = getIntent().getStringExtra("ARRIVEE");       
  
          /* Appel de la méthode asynchrone // ASYNCHRONOUS METHOD
           * ATTENTION : Il faut que ItineraireTask soit extends AsyncTask&lt;Void, Integer, Boolean&gt;
           * Sinon, on ne pourra pas utilise la methode execute() */
          new ItineraireTask(this, googlemap, editDepart, editArrivee).execute();
  
      }
  }
  </code></pre>
  
  <p>Here is my <strong>ItineraireTask</strong> :</p>
  
  <pre><code>    public class ItineraireTask extends AsyncTask&lt;Void, Integer, Boolean&gt; 
  {
      private static final String TOAST_MSG = "Calcul de l'itinéraire en cours";
      private static final String TOAST_ERR_MAJ = "Impossible de trouver un itinéraire";
  
      private Context context;
      private GoogleMap gMap;
      private String editDepart;
      private String editArrivee;
      private final ArrayList&lt;LatLng&gt; lstLatLng = new ArrayList&lt;LatLng&gt;();
  
      /** CONSTRUCTEUR **/
      public ItineraireTask(final Context context, final GoogleMap gMap, final String editDepart, final String editArrivee) 
      {
          this.context = context;
          this.gMap= gMap;
          this.editDepart = editDepart;
          this.editArrivee = editArrivee;
      }    
  
      protected void onPreExecute() 
      {
          Toast.makeText(context, TOAST_MSG, Toast.LENGTH_LONG).show();
      }
  
      protected Boolean doInBackground(Void... params) 
      {
          try 
          {
              //Construction de l'url à appeler          
              final StringBuilder url = new StringBuilder("http://maps.googleapis.com/maps/api/directions/xml?sensor=false&amp;language=fr");
              url.append("&amp;origin=");
              url.append(editDepart.replace(' ', '+'));
              url.append("&amp;destination=");
              url.append(editArrivee.replace(' ', '+'));
  
              //Appel du web service
              final InputStream stream = new URL(url.toString()).openStream();
  
              //Traitement des données
              final DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
              documentBuilderFactory.setIgnoringComments(true);
  
              final DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
  
              final Document document = documentBuilder.parse(stream);
              document.getDocumentElement().normalize();
  
              //On récupère d'abord le status de la requête
              final String status = document.getElementsByTagName("status").item(0).getTextContent();
              if(!"OK".equals(status)) 
              {
                  return false;
              }
  
              //On récupère les steps
              final Element elementLeg = (Element) document.getElementsByTagName("leg").item(0);
              final NodeList nodeListStep = elementLeg.getElementsByTagName("step");
              final int length = nodeListStep.getLength();
  
              for(int i=0; i&lt;length; i++) 
              {       
              final Node nodeStep = nodeListStep.item(i); 
                  if(nodeStep.getNodeType() == Node.ELEMENT_NODE) 
                  {
                      final Element elementStep = (Element) nodeStep;
  
                      //On décode les points du XML
                      decodePolylines(elementStep.getElementsByTagName("points").item(0).getTextContent());
                  }
              }
              return true;           
          }
          catch(final Exception e) 
          {
              return false;
          }
      }
  
  
      /** METHODE QUI DECODE LES POINTS EN LAT-LONG**/
      private void decodePolylines(final String encodedPoints) 
      {
          int index = 0;
          int lat = 0, lng = 0;
  
          while (index &lt; encodedPoints.length()) 
          {
              int b, shift = 0, result = 0;
  
              do 
              {
                  b = encodedPoints.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 = encodedPoints.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; 
              lstLatLng.add(new LatLng((double)lat/1E5, (double)lng/1E5));
          }
      }
  
  
      protected void onPostExecute(final Boolean result) 
      {   
          if(!result) 
          {
              Toast.makeText(context, TOAST_ERR_MAJ, Toast.LENGTH_SHORT).show();
          }
          else 
          {
              //On déclare le polyline, c'est-à-dire le trait (ici bleu) que l'on ajoute sur la carte pour tracer l'itinéraire
              final PolylineOptions polylines = new PolylineOptions();
              polylines.color(Color.BLUE);
  
              //On construit le polyline
              for(final LatLng latLng : lstLatLng)
              {
                  polylines.add(latLng);
              }        
              //On déclare un marker vert que l'on placera sur le départ
              final MarkerOptions markerA = new MarkerOptions();
              markerA.position(lstLatLng.get(0));
              markerA.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN));
  
              //On déclare un marker rouge que l'on mettra sur l'arrivée
              final MarkerOptions markerB = new MarkerOptions();
              markerB.position(lstLatLng.get(lstLatLng.size()-1));
              markerB.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED));
  
              //On met à jour la carte
              gMap.moveCamera(CameraUpdateFactory.newLatLngZoom(lstLatLng.get(0), 10));
              gMap.addMarker(markerA);
              gMap.addPolyline(polylines);
              gMap.addMarker(markerB);
          }
      }
  }
  </code></pre>
  
  <p>Thanks to you in advance !</p>
  
  <p>Best regards,</p>
  
  <p>Tofuw</p>