Mostrar ruta en Google Maps API v2 en Android

Estoy intentando mostrar la ruta de conducción entre dos puntos de MarkerOptions en Android. He encontrado este tutorial aquí , que funciona bien para mí, pero estoy tratando de MarkerOptions para que las MarkerOptions sean mi ubicación actual y un objeto LatLng fijo, no dos puntos que se obtiene al tocar el mapa. Así que tengo mi ubicación actual, LatLng = updatedLatLng y el fijo es LatLng = wcbcLatLng . En el tutorial, el método onMapClick tiene este aspecto:

  public void onTouchMap(){ // Setting onclick event listener for the map this.mapG3.setOnMapClickListener(new OnMapClickListener() { @Override public void onMapClick(LatLng point) { // Already two locations if (Geo4.this.markerPoints.size() > 1) { Geo4.this.markerPoints.clear(); Geo4.this.mapG3.clear(); } // Adding new item to the ArrayList Geo4.this.markerPoints.add(point); // Creating MarkerOptions MarkerOptions options = new MarkerOptions(); // Setting the position of the marker 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 (Geo4.this.markerPoints.size() == 1) { options.icon(BitmapDescriptorFactory .defaultMarker (BitmapDescriptorFactory.HUE_GREEN)); } else if (Geo4.this.markerPoints.size() == 2) { options.icon(BitmapDescriptorFactory .defaultMarker (BitmapDescriptorFactory.HUE_RED)); } // Add new marker to the Google Map Android API V2 Geo4.this.mapG3.addMarker(options); // Checks, whether start and end locations are captured if (Geo4.this.markerPoints.size() >= 2) { LatLng origin = Geo4.this.markerPoints.get(0); LatLng dest = Geo4.this.markerPoints.get(1); // Getting URL to the Google Directions API String url = Geo4.this.getDirectionsUrl(origin, dest); DownloadTask downloadTask = new DownloadTask(); // Start downloading json data from Google Directions API downloadTask.execute(url); } } }); }//-- END Method 

Este es el método que quiero modificar para que busque mi updatedLatLng & wcbcLatLng lugar del LatLng origin LatLng dest & LatLng dest que el método está utilizando actualmente. ¡Cualquier ayuda sería apreciada! Aquí está mi actividad completa:

  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.app.AlertDialog; import android.content.Intent; import android.graphics.Color; 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.MenuItem; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import com.google.android.gms.common.GooglePlayServicesUtil; import com.google.android.gms.maps.CameraUpdate; import com.google.android.gms.maps.CameraUpdateFactory; 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.LatLngBounds; import com.google.android.gms.maps.model.Marker; import com.google.android.gms.maps.model.MarkerOptions; import com.google.android.gms.maps.model.PolylineOptions; import android.location.Criteria; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.provider.Settings; public class Geo4 extends FragmentActivity implements LocationListener { GoogleMap mapG3; ArrayList<LatLng> markerPoints; TextView mapInfo_TV; LocationManager locMan; SupportMapFragment sMf; Button back_btn, zoom_btn; MarkerOptions startMO, wcbcMO, broncoMO; MarkerOptions markers; Marker currentMarker, wcbcMarker, broncoMarker; LatLng updatedLatLng, directionsLatLng; LatLng wcbcLatLng = new LatLng(30.393903, -97.682871); LatLng oskiLatLng = new LatLng(30.474570, -97.973889); LatLng point, point3t, point4t; CameraUpdate cameraUpdate; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.geo3); back_btn = (Button) findViewById(R.id.backMap_g3_btn); zoom_btn = (Button) findViewById(R.id.marker_g3_btn); this.mapInfo_TV = (TextView) this.findViewById(R.id.map_g3Info_TV); // Initializing this.markerPoints = new ArrayList<LatLng>(); // Getting reference to SupportMapFragment of the activity_main sMf = (SupportMapFragment) this.getSupportFragmentManager() .findFragmentById(R.id.map_g3_FRAG); // Getting Map for the SupportMapFragment this.mapG3 = sMf.getMap(); // --- fire Methods googlePlay(); getCurrentLocation(); onTouchMap(); // --- END fire Methods // --- Back button back_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // mapG3.clear(); Intent backmapI = new Intent( "com.my.package.BUTTON_INTERFACE"); startActivity(backmapI); } }); // --- end Back button // --- Zoom button zoom_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { getDirections4T(point4t); } }); // --- end Zoom button }// --- END onCreate // --- Methods ---- public void googlePlay() { // ---- Google Play // 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 //Toast.makeText(getApplicationContext(),"Services Launched Fo Sho'",Toast.LENGTH_SHORT).show(); } } // ---- END Method public void getCurrentLocation(){ // Getting LocationManager object from System Service LOCATION_SERVICE locMan = (LocationManager) getSystemService(LOCATION_SERVICE); boolean enabledGPS = locMan .isProviderEnabled(LocationManager.GPS_PROVIDER); boolean enabledWiFi = locMan .isProviderEnabled(LocationManager.NETWORK_PROVIDER); // Check if enabled and if not send user to the GPS settings if (!enabledGPS && !enabledWiFi) { Toast.makeText(getApplicationContext(), "GPS signal not found", Toast.LENGTH_LONG).show(); Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivity(intent); } // Creating a criteria object to retrieve provider Criteria criteria = new Criteria(); // Getting the name of the best provider String provider = locMan.getBestProvider(criteria, true); // Getting Current Location From GPS Location oLc = locMan.getLastKnownLocation(provider); if (oLc != null) { onLocationChanged(oLc); } locMan.requestLocationUpdates(provider, 20000, 0, this); }//--- END Method public void zoomToFit() { // --- zoom to fit LatLngBounds.Builder builder = new LatLngBounds.Builder(); builder.include(wcbcLatLng); builder.include(updatedLatLng); LatLngBounds bounds = builder.build(); int padding = 50; // offset from edges of the map in pixels cameraUpdate = CameraUpdateFactory.newLatLngBounds(bounds, padding); mapG3.animateCamera(cameraUpdate); // --- END zoom to fit }// --- END Method public void addwcbcMarkerOption() { wcbcMO = new MarkerOptions().position(wcbcLatLng).title( "Destination"); wcbcMO.icon(BitmapDescriptorFactory .defaultMarker(BitmapDescriptorFactory.HUE_VIOLET)); mapG3.addMarker(wcbcMO); cameraUpdate = CameraUpdateFactory.newLatLngZoom(wcbcLatLng, 15); mapG3.animateCamera(cameraUpdate); }// --- END Method public void getDirections4T(LatLng point4t) { Geo4.this.markerPoints.add(point4t); markers = new MarkerOptions(); markers.position(wcbcLatLng); markers.position(oskiLatLng); if (Geo4.this.markerPoints.size() == 1) { markers.icon(BitmapDescriptorFactory .defaultMarker(BitmapDescriptorFactory.HUE_GREEN)); } else if (Geo4.this.markerPoints.size() == 2) { markers.icon(BitmapDescriptorFactory .defaultMarker(BitmapDescriptorFactory.HUE_RED)); } Geo4.this.mapG3.addMarker(markers); }//--- END Method public void onTouchMap(){ // Setting onclick event listener for the map this.mapG3.setOnMapClickListener(new OnMapClickListener() { @Override public void onMapClick(LatLng point) { // Already two locations if (Geo4.this.markerPoints.size() > 1) { Geo4.this.markerPoints.clear(); Geo4.this.mapG3.clear(); } // Adding new item to the ArrayList Geo4.this.markerPoints.add(point); // Creating MarkerOptions MarkerOptions options = new MarkerOptions(); // Setting the position of the marker 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 (Geo4.this.markerPoints.size() == 1) { options.icon(BitmapDescriptorFactory .defaultMarker (BitmapDescriptorFactory.HUE_GREEN)); } else if (Geo4.this.markerPoints.size() == 2) { options.icon(BitmapDescriptorFactory .defaultMarker (BitmapDescriptorFactory.HUE_RED)); } // Add new marker to the Google Map Android API V2 Geo4.this.mapG3.addMarker(options); // Checks, whether start and end locations are captured if (Geo4.this.markerPoints.size() >= 2) { LatLng origin = Geo4.this.markerPoints.get(0); LatLng dest = Geo4.this.markerPoints.get(1); // Getting URL to the Google Directions API String url = Geo4.this.getDirectionsUrl(origin, dest); DownloadTask downloadTask = new DownloadTask(); // Start downloading json data from Google Directions API downloadTask.execute(url); } } }); }//-- END Method private String getDirectionsUrl(LatLng updatedLatLng, LatLng dest) { // Origin of route String str_updatedLatLng = "origin=" + updatedLatLng.latitude + "," + updatedLatLng.longitude; // Destination of route String str_dest = "destination=" + dest.latitude + "," + dest.longitude; // Sensor enabled String sensor = "sensor=false"; // Building the parameters to the web service String parameters = str_updatedLatLng + "&" + str_dest + "&" + sensor; // Output format String output = "json"; // Building the url to the web service String url = "https://maps.googleapis.com/maps/api/directions/" + output + "?" + parameters; 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); // 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; } // Fetches data from url passed private class DownloadTask extends AsyncTask<String, Void, String> { // Downloading data in non-ui thread @Override protected String doInBackground(String... url) { // For storing data from web service String data = ""; try { // Fetching the data from web service data = Geo4.this.downloadUrl(url[0]); } catch (Exception e) { Log.d("Background Task", e.toString()); } return data; } // Executes in UI thread, after the execution of // doInBackground() @Override protected void onPostExecute(String result) { super.onPostExecute(result); ParserTask parserTask = new ParserTask(); // Invokes the thread for parsing the JSON data 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>>>> { // Parsing the data in non-ui thread @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]); Geo3JSON parser = new Geo3JSON(); // Starts parsing data routes = parser.parse(jObject); } catch (Exception e) { e.printStackTrace(); } return routes; } // Executes in UI thread, after the parsing process @Override protected void onPostExecute(List<List<HashMap<String, String>>> result) { ArrayList<LatLng> points = null; PolylineOptions lineOptions = null; MarkerOptions markerOptions = new MarkerOptions(); String distance = ""; String duration = ""; if (result.size() < 1) { Toast.makeText(Geo4.this.getBaseContext(), "No Points", Toast.LENGTH_SHORT).show(); return; } // Traversing through all the routes for (int i = 0; i < result.size(); i++) { points = new ArrayList<LatLng>(); lineOptions = new PolylineOptions(); // Fetching i-th route List<HashMap<String, String>> path = result.get(i); // Fetching all the points in i-th route for (int j = 0; j < path.size(); j++) { HashMap<String, String> point = path.get(j); if (j == 0) { // Get distance from the list distance = point.get("distance"); continue; } else if (j == 1) { // Get duration from the list duration = point.get("duration"); continue; } double lat = Double.parseDouble(point.get("lat")); double lng = Double.parseDouble(point.get("lng")); LatLng position = new LatLng(lat, lng); points.add(position); } // Adding all the points in the route to LineOptions lineOptions.addAll(points); lineOptions.width(4); lineOptions.color(Color.RED); } Geo4.this.mapInfo_TV.setText("Distance: " + distance + "les"); // Drawing polyline in the Google Map for the route Geo4.this.mapG3.addPolyline(lineOptions); } } // --- END Methods // --- onLocationListener @Override public void onLocationChanged(Location oLc) { updatedLatLng = new LatLng(oLc.getLatitude(), oLc.getLongitude()); startMO = new MarkerOptions().position(updatedLatLng) .title("You Are Here") .icon(BitmapDescriptorFactory .defaultMarker(BitmapDescriptorFactory.HUE_ORANGE)); mapG3.addMarker(startMO); addwcbcMarkerOption(); locMan.removeUpdates(this); } @Override public void onProviderDisabled(String provider) { // } @Override public void onProviderEnabled(String provider) { // } @Override public void onStatusChanged(String provider, int status, Bundle extras) { // } // --- END onLocationListener @Override protected void onPause() { super.onPause(); overridePendingTransition(R.anim.fadein, R.anim.fadeout); finish(); } // --- inflated menu @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.wcbcv, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_legalnotices: String LicenseInfo = GooglePlayServicesUtil .getOpenSourceSoftwareLicenseInfo(getApplicationContext ()); AlertDialog.Builder LicenseDialog = new AlertDialog.Builder( Geo4.this); LicenseDialog.setTitle("Legal Notices"); LicenseDialog.setMessage(LicenseInfo); LicenseDialog.show(); return true; } return super.onOptionsItemSelected(item); } // --- END inflated menu } 

Me lo imaginé. La mayoría de mis onTouchMap() está recibiendo la información de onTouch y convirtiendo esos enteros a LatLng valores. Como ya tengo los valores LatLng , sólo necesito las tres últimas líneas del método que toman LatLng y obtengo los datos JSON de ellos. Así que reescribí el método para agregar primero las MarkerOptions y los valores de LatLng , luego añadí las últimas 3 líneas del método antiguo. Así que aquí está mi nuevo método, y funciona correctamente (llamando a otros 3 métodos) y dibuja la polilínea y muestra la distancia en millas en un TextView .

  public void addMarkers(){ wcbcMO = new MarkerOptions().position(wcbcLatLng) .title("Destination") .icon(BitmapDescriptorFactory .defaultMarker(BitmapDescriptorFactory.HUE_VIOLET)); mapG3.addMarker(wcbcMO); startMO = new MarkerOptions().position(updatedLatLng) .title("You Are Here") .icon(BitmapDescriptorFactory .defaultMarker(BitmapDescriptorFactory.HUE_ORANGE)); mapG3.addMarker(startMO); // Getting URL to the Google Directions API String url = Geo4.this.getDirectionsUrl(updatedLatLng, wcbcLatLng); DownloadTask downloadTask = new DownloadTask(); // Start downloading json data from Google Directions API downloadTask.execute(url); }//--- END Method 
 public class MainActivity extends Activity { static final LatLng HAMBURG = new LatLng(53.558, 9.927); static final LatLng KIEL = new LatLng(53.551, 9.993); private GoogleMap map; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)) .getMap(); Marker hamburg = map.addMarker(new MarkerOptions().position(HAMBURG) .title("Hamburg")); Marker kiel = map.addMarker(new MarkerOptions() .position(KIEL) .title("Kiel") .snippet("Kiel is cool") .icon(BitmapDescriptorFactory .fromResource(R.drawable.ic_launcher))); map.moveCamera(CameraUpdateFactory.newLatLngZoom(HAMBURG, 15)); map.setMyLocationEnabled(true); map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null); map.setOnMapClickListener(new OnMapClickListener() { private double latitude; private double longitude; @Override public void onMapClick(LatLng arg0) { latitude = arg0.latitude; longitude = arg0.longitude; StringBuilder result = new StringBuilder(); try { Geocoder geocoder = new Geocoder(MainActivity.this, Locale .getDefault()); List<Address> addresses = geocoder.getFromLocation( latitude, longitude, 1); if (addresses.size() > 0) { Address address = addresses.get(0); result.append(address.getLocality()).append("\n"); result.append(address.getCountryName()); Toast.makeText(getApplicationContext(), result, 3000) .show(); } } catch (IOException e) { Log.e("tag", e.getMessage()); } } }); } public String makeURL (double sourcelat, double sourcelog, double destlat, double destlog ){ StringBuilder urlString = new StringBuilder(); urlString.append("http://maps.googleapis.com/maps/api/directions/json"); urlString.append("?origin=");// from urlString.append(Double.toString(sourcelat)); urlString.append(","); urlString .append(Double.toString( sourcelog)); urlString.append("&destination=");// to urlString .append(Double.toString( destlat)); urlString.append(","); urlString.append(Double.toString( destlog)); urlString.append("&sensor=false&mode=driving&alternatives=true"); return urlString.toString(); } public class JSONParser { InputStream is = null; JSONObject jObj = null; String json = ""; public JSONParser() { } public String getJSONFromUrl(String url) { try { DefaultHttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(url); HttpResponse httpResponse = httpClient.execute(httpPost); 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"); } json = sb.toString(); is.close(); } catch (Exception e) { Log.e("Buffer Error", "Error converting result " + e.toString()); } return json; } } private String url; JSONParser jParser = new JSONParser(); String json = jParser.getJSONFromUrl(url); public void drawPath(String result) { try { final JSONObject json = new JSONObject(result); JSONArray routeArray = json.getJSONArray("routes"); JSONObject routes = routeArray.getJSONObject(0); JSONObject overviewPolylines = routes.getJSONObject("overview_polyline"); String encodedString = overviewPolylines.getString("points"); List<LatLng> list = decodePoly(encodedString); for(int z = 0; z<list.size()-1;z++){ LatLng src= list.get(z); LatLng dest= list.get(z+1); Polyline line = map.addPolyline(new PolylineOptions() .add(new LatLng(src.latitude, src.longitude), new LatLng(dest.latitude, dest.longitude)) .width(2) .color(Color.BLUE).geodesic(true)); } } catch (JSONException e) { } } 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; } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } } 
  • Eliminar el icono de ubicación predeterminado del usuario
  • Asegúrese de que la "API de Google Maps para Android v2" esté habilitada. Estoy recibiendo este error cuando intento implementar Google Maps
  • Google Maps API v2 dibuja parte del círculo en MapFragment
  • Google google maps agrega al marcador propia etiqueta
  • Google NavigationDrawer no dibuja correctamente en el mapa
  • Android Maps v2 - animar la cámara para incluir la mayoría de los marcadores
  • ¿Cómo puedo agregar un botón a la ventana de información de un marcador?
  • No se puede reemplazar el fragmento dentro de la pestaña por otro fragmento
  • Android error Dx problema salida de escritura: ya preparado Error generando archivo final: Encontró archivo duplicado para APK: classes.dex
  • Compruebe si la latitud y la longitud están dentro de un círculo
  • API de Google MAPs para Android límite de 2500 solicitudes / día es por dispositivo cliente o por clave de aplicación?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.