java - waypoints - Lanzamiento de Google Maps Directions a través de un intento en Android
waypoints android google maps (13)
Mi aplicación necesita mostrar las direcciones de Google Maps de A a B, pero no quiero poner Google Maps en mi aplicación; en cambio, quiero iniciarla con un Intent. es posible? Si es así, ¿cómo?
Aunque las respuestas actuales son excelentes, ninguna de ellas hizo lo que estaba buscando, solo quería abrir la aplicación de mapas, agregar un nombre para cada ubicación de origen y destino, usar el esquema de URI de geo no funcionaría para mí En todo caso, el enlace web de los mapas no tenía etiquetas, así que se me ocurrió esta solución, que es esencialmente una amalgama de las otras soluciones y comentarios que se hacen aquí. Esperamos que sea útil para otros que vean esta pregunta.
String uri = String.format(Locale.ENGLISH, "http://maps.google.com/maps?saddr=%f,%f(%s)&daddr=%f,%f (%s)", sourceLatitude, sourceLongitude, "Home Sweet Home", destinationLatitude, destinationLongitude, "Where the party is at");
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
intent.setPackage("com.google.android.apps.maps");
startActivity(intent);
Para usar su ubicación actual como punto de partida (desafortunadamente no he encontrado una manera de etiquetar la ubicación actual), use la siguiente
String uri = String.format(Locale.ENGLISH, "http://maps.google.com/maps?daddr=%f,%f (%s)", destinationLatitude, destinationLongitude, "Where the party is at");
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
intent.setPackage("com.google.android.apps.maps");
startActivity(intent);
Para completar, si el usuario no tiene la aplicación de mapas instalada, será una buena idea capturar la excepción ActivityNotFoundException, luego podremos comenzar la actividad nuevamente sin la restricción de la aplicación de mapas, podemos estar bastante seguros de que nunca obtendremos Toast al final, ya que un navegador de Internet es una aplicación válida para iniciar este esquema de URL también.
String uri = String.format(Locale.ENGLISH, "http://maps.google.com/maps?daddr=%f,%f (%s)", 12f, 2f, "Where the party is at");
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
intent.setPackage("com.google.android.apps.maps");
try
{
startActivity(intent);
}
catch(ActivityNotFoundException ex)
{
try
{
Intent unrestrictedIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
startActivity(unrestrictedIntent);
}
catch(ActivityNotFoundException innerEx)
{
Toast.makeText(this, "Please install a maps application", Toast.LENGTH_LONG).show();
}
}
PD: cualquier latitud o longitud utilizada en mi ejemplo no es representativa de mi ubicación, cualquier parecido con una ubicación verdadera es pura coincidencia, alias no soy de África: P
EDITAR:
Para instrucciones, un intento de navegación ahora es compatible con google.navigation
Uri navigationIntentUri = Uri.parse("google.navigation:q=" + 12f +"," + 2f);//creating intent with latlng
Intent mapIntent = new Intent(Intent.ACTION_VIEW, navigationIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);
Bueno, puedes intentar abrir la aplicación integrada Android Maps usando el método Intent.setClassName
.
Intent i = new Intent(Intent.ACTION_VIEW,Uri.parse("geo:37.827500,-122.481670"));
i.setClassName("com.google.android.apps.maps",
"com.google.android.maps.MapsActivity");
startActivity(i);
Esto es lo que funcionó para mí:
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://maps.google.co.in/maps?q=" + yourAddress));
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
Esto es un poco fuera de tema porque pidió "direcciones", pero también puede usar el esquema de URI de Geo que se describe en la documentación de Android:
http://developer.android.com/guide/appendix/g-app-intents.html
El problema con "geo: latitud, longitud" es que Google Maps solo se centra en su punto, sin ningún pin o etiqueta.
Eso es bastante confuso, especialmente si necesita señalar un lugar preciso y / o pedir direcciones.
Si usa el parámetro de consulta "geo: lat, lon? Q = name" para etiquetar su punto geográfico, usa la consulta para buscar y descartar los parámetros lat / lon.
Encontré una forma de centrar el mapa con lat / lon y mostrar un pin con una etiqueta personalizada, muy agradable de mostrar y útil al solicitar direcciones o cualquier otra acción:
Intent intent = new Intent(android.content.Intent.ACTION_VIEW,
Uri.parse("geo:0,0?q=37.423156,-122.084917 (" + name + ")"));
startActivity(intent);
NOTA (por @TheNail): no funciona en Maps v.7 (última versión en el momento de la escritura). Ignorará las coordenadas y buscará un objeto con el nombre dado entre paréntesis. Ver también Intent para Google Maps 7.0.0 con ubicación.
Google DirectionsView
con la ubicación de origen como ubicación actual y ubicación de destino como una cadena
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://maps.google.com/maps?f=d&daddr="+destinationCityName));
intent.setComponent(new ComponentName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity"));
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
En el destinationCityName
anterior hay una cadena que se modifica como sea necesario.
Para los puntos de paso múltiples, se puede usar lo siguiente también.
Intent intent = new Intent(android.content.Intent.ACTION_VIEW,
Uri.parse("https://www.google.com/maps/dir/48.8276261,2.3350114/48.8476794,2.340595/48.8550395,2.300022/48.8417122,2.3028844"));
startActivity(intent);
El primer conjunto de coordenadas es su ubicación inicial. Todos los siguientes son puntos de paso, la ruta trazada atraviesa.
Solo sigue agregando puntos de ruta concilando "/ latitude, longitude" al final. Según parece, hay un límite de 23 puntos de paso según los documentos de Google . No estoy seguro si eso se aplica a Android también.
Podrías usar algo como esto:
Intent intent = new Intent(android.content.Intent.ACTION_VIEW,
Uri.parse("http://maps.google.com/maps?saddr=20.344,34.34&daddr=20.5666,45.345"));
startActivity(intent);
Para iniciar la navegación desde la ubicación actual, elimine el parámetro y el valor de saddr
.
Puede usar una dirección real en lugar de latitud y longitud. Sin embargo, esto le dará al usuario un cuadro de diálogo para elegir entre abrirlo mediante el navegador o Google Maps.
Esto activará Google Maps en modo de navegación directamente:
Intent intent = new Intent(android.content.Intent.ACTION_VIEW,
Uri.parse("google.navigation:q=an+address+city"));
ACTUALIZAR
En mayo de 2017, Google lanzó la nueva API para las URL universales de Google Maps multiplataforma:
https://developers.google.com/maps/documentation/urls/guide
También puedes usar Intents con la nueva API.
Primero debe saber que puede usar la intención implícita, la documentación de Android nos brinda una serie de intenciones comunes muy detalladas para implementar la intención del mapa que necesita para crear una nueva intención con dos parámetros
- Acción
- Uri
Para la acción podemos usar Intent.ACTION_VIEW
y para Uri deberíamos Desarrollarlo, a continuación adjunto un código de muestra para crear, construir e iniciar la actividad.
String addressString = "1600 Amphitheatre Parkway, CA";
/*
Build the uri
*/
Uri.Builder builder = new Uri.Builder();
builder.scheme("geo")
.path("0,0")
.query(addressString);
Uri addressUri = builder.build();
/*
Intent to open the map
*/
Intent intent = new Intent(Intent.ACTION_VIEW, addressUri);
/*
verify if the devise can launch the map intent
*/
if (intent.resolveActivity(getPackageManager()) != null) {
/*
launch the intent
*/
startActivity(intent);
}
Si conoce el punto A, el punto B (y las características o pistas intermedias) puede usar un archivo KML junto con su intención.
String kmlWebAddress = "http://www.afischer-online.de/sos/AFTrack/tracks/e1/01.24.Soltau2Wietzendorf.kml";
String uri = String.format(Locale.ENGLISH, "geo:0,0?q=%s",kmlWebAddress);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
startActivity(intent);
Para más información, vea esta respuesta SO
NOTA: este ejemplo utiliza un archivo de muestra que (hasta el 13 de marzo) aún está en línea. si se ha desconectado, busque un archivo kml en línea y cambie su url
Si está interesado en mostrar la latitud y la longitud desde la dirección actual, puede usar esto:
Las direcciones siempre se dan desde la ubicación actual de los usuarios.
La siguiente consulta te ayudará a realizar eso. Puede pasar la latitud y longitud de destino aquí:
google.navigation:q=latitude,longitude
Use arriba como:
Uri gmmIntentUri = Uri.parse("google.navigation:q=latitude,longitude");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);
O si quieres mostrar vía ubicación, usa:
google.navigation:q=a+street+address
Más información aquí: Google Maps Intents para Android
Uso de las últimas URL de Google Maps multiplataforma : incluso si falta la aplicación Google Maps , se abrirá en el navegador
Ejemplo https://www.google.com/maps/dir/?api=1&origin=81.23444,67.0000&destination=80.252059,13.060604
Uri.Builder builder = new Uri.Builder();
builder.scheme("https")
.authority("www.google.com").appendPath("maps").appendPath("dir").appendPath("").appendQueryParameter("api", "1")
.appendQueryParameter("destination", 80.00023 + "," + 13.0783);
String url = builder.build().toString();
Log.d("Directions", url);
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);
prueba esto
Intent intent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse("http://maps.google.com/maps?saddr="+src_lat+","+src_ltg+"&daddr="+des_lat+","+des_ltg));
intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");
startActivity(intent);
Uri.Builder directionsBuilder = new Uri.Builder()
.scheme("https")
.authority("www.google.com")
.appendPath("maps")
.appendPath("dir")
.appendPath("")
.appendQueryParameter("api", "1")
.appendQueryParameter("destination", lat + "," + lon);
startActivity(new Intent(Intent.ACTION_VIEW, directionsBuilder.build()));