Lanzar Direcciones de Google Maps a través de una intención en Android

Respuestas:

630

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 saddrparámetro y el valor.

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 a través del 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 URL universales multiplataforma de Google Maps:

https://developers.google.com/maps/documentation/urls/guide

También puedes usar Intents con la nueva API.

Jan S.
fuente
2
No que yo sepa. Sin embargo, no habrá ningún diálogo si el usuario ya ha elegido la aplicación predeterminada para abrir este tipo de intenciones para que sea la aplicación de mapa.
Jan S.
111
Si desea deshacerse del cuadro de diálogo, puede darle a la intención una pista sobre qué paquete desea usar. Antes del inicio Actividad () agregue esto: intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");
Jeremy Logan
y cómo forzarlo a mostrarlo en el navegador y no en la aplicación googlemaps?
NullPointerException
68
Forzar al usuario a una actividad específica cuando pueden tener otras aplicaciones que prefieran me parece contrario al espíritu de Android. Estaría tentado a dejar que los filtros intencionales se encarguen de las cosas aquí.
superluminary
15
Las intenciones de navegación parecen ser oficialmente compatibles ahora: developers.google.com/maps/documentation/android/…
Sanketh Katta
124

Esto está un poco fuera de tema porque solicitó "instrucciones", pero también puede usar el esquema Geo URI descrito en la Documentación de Android:

http://developer.android.com/guide/appendix/g-app-intents.html

El problema al usar "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 o pedir indicaciones.

Si utiliza el parámetro de consulta "geo: lat, lon? Q = name" para etiquetar su geopunto, utiliza 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 redacción). Ignorará las coordenadas y buscará un objeto con el nombre entre paréntesis. Ver también Intención para Google Maps 7.0.0 con ubicación

Murphy
fuente
3
Niza, el geo predeterminado: 0,0 simplemente mueve el mapa allí. Esta solución ["geo: 0,0? Q = 37.423156, -122.084917 (" + name + ")"] le permite poner su propio nombre de marcador. Gracias.
gnac
44
Funciona muy bien: para su información, parece que no funciona junto con el parámetro de consulta "z" (nivel de zoom)
scolestock
1
¿Es posible establecer el modo de tránsito predeterminado en la intención? Por defecto, la opción de coche está seleccionada. ¿Puedo configurar Walking como el modo predeterminado?
Oso el
66
¿Por qué no lo usas geo:37.423156,-122.084917?q=37.423156,-122.084917 ...?
rekire
1
Asegúrese de urlEncode el parámetro de etiqueta. Tuve problemas con caracteres especiales como el espacio.
Ethan
100

Aunque las respuestas actuales son geniales, ninguna de ellas hizo exactamente 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 geo URI no funcionaría para mí en absoluto y 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 hechos aquí, espero que sea útil para otros que ven 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 lo 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, entonces será una buena idea detectar la ActivityNotFoundException, entonces podemos 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 lanzar 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 Las latitudes o longitudes utilizadas en mi ejemplo no son representativas de mi ubicación, cualquier semejanza con una ubicación verdadera es pura coincidencia, es decir, no soy de África: P

EDITAR:

Para obtener instrucciones, ahora se admite una intención de navegación 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);
David Thompson
fuente
2
¡Esta es una gran respuesta, David! ¿También sabes cómo iniciar realmente la navegación dentro de la aplicación de navegación? En su estado actual, el usuario tiene que hacer clic en 'Iniciar navegación' por última vez. Busqué en Google cualquier parámetro para pasar, pero no pude encontrar ninguno.
Nirmal
Al presionar el botón Atrás desde la aplicación de mapas, aparece una pantalla en negro y se recrea la actividad subyacente. ¿Alguna idea de cómo solucionar esto?
Jas
@Jas eliminar el método intent.setclassname
Ameen Maheen
Hola, el código anterior está tardando mucho en iniciar la aplicación de mapas predeterminada en la versión de Android 4.4.2, 4.4.4 y 5.0.2. Su lanzamiento está bien en la versión 5.1 y Marshmallow. ¿Podría ayudarme a resolver este problema?
OnePunchMan
Ahora sugeriría usar intent.SetPackage en lugar de intent.setClassName ("com.google.android.apps.maps", "com.google.android.maps.MapsActivity"); Actualizaré la respuesta para reflejar esto.
David Thompson,
22

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);
lakshman sai
fuente
10

Abra Google Maps usando Intent con diferentes modos:

Podemos abrir la aplicación Google Maps con la intención:

val gmmIntentUri = Uri.parse("google.navigation:q="+destintationLatitude+","+destintationLongitude + "&mode=b")
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.setPackage("com.google.android.apps.maps")
startActivity(mapIntent)

Aquí, "modo = b" es para bicicleta.

Podemos configurar el modo de conducir, caminar y andar en bicicleta usando:

  • d para conducir
  • w para caminar
  • b para andar en bicicleta

Puede encontrar más información sobre la intención con google maps aquí .

Nota: Si no hay una ruta para la bicicleta / automóvil / caminata, le mostrará "No puedo encontrar el camino"

Puedes consultar mi respuesta original aquí .

SANAT
fuente
8

Bueno, puedes intentar abrir la aplicación integrada Android Maps utilizando el Intent.setClassNamemétodo.

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);
Jonathan Cáceres Romero
fuente
6

Para puntos de paso múltiples, también se puede utilizar el siguiente.

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 ruta, la ruta trazada pasa.

Simplemente siga agregando puntos de ruta concatenando "/ latitud, longitud" al final. Aparentemente, hay un límite de 23 puntos de referencia según los documentos de Google . No estoy seguro si eso también se aplica a Android.

Adeel Tariq
fuente
¿Qué no funciona? ¿Qué estás viendo al ejecutar este código exacto?
Adeel Tariq
En realidad no use las coordenadas exactas que puse aquí. Están en el medio de la nada, en algún lugar sin carreteras, así que eso no funcionará.
Adeel Tariq
4

Si está interesado en mostrar la latitud y la longitud desde la dirección actual, puede usar esto:

Siempre se dan instrucciones desde la ubicación actual de los usuarios.

La siguiente consulta lo 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 desea mostrar por ubicación, use:

google.navigation:q=a+street+address

Más información aquí: Google Maps Intents para Android

WannaBeGeek
fuente
para las instrucciones para trabajar, necesitaba agregarmapIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Someone Somewhere
4

Google DirectionsViewcon la ubicación de origen como ubicación actual y la 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 lo anterior destinationCityNamehay una cadena variable modificable según sea necesario.

Ramesh kumar
fuente
3

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);
Soluciones Web Vijay
fuente
3

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);
}
JediCate
fuente
1

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, ver esta respuesta SO

NOTA: este ejemplo utiliza un archivo de muestra que (a partir de mar13) todavía está en línea. si se ha desconectado, busque un archivo kml en línea y cambie su url

Tony Gil
fuente
1
Al presionar el botón Atrás desde la aplicación de mapas, aparece una pantalla en negro y se recrea la actividad subyacente. ¿Alguna idea de cómo solucionar esto?
Jas
@Jas, google cambió muchas de sus API y este comportamiento también puede haber cambiado. He estado usando mapas de calles abiertos exclusivamente durante bastante tiempo, por lo que podría ayudarlo. :)
Tony Gil
0

Primero necesita ahora que puede usar la intención implícita, la documentación de Android nos proporciona 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 que podemos usar Intent.ACTION_VIEW y para Uri debemos compilarlo, 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);
    }
Bachiri Taoufiq Abderrahman
fuente
1
El uso de Uri.Builder solo funciona para URI absolutos, en forma de: <scheme>://<authority><absolute path>?<query>#<fragment>no URI opacos <scheme>:<opaque part>#<fragment>. El código anterior produce el siguiente URI: lo geo:/0%2C0?Eiffel%20Towerque hace que la aplicación Google Maps se bloquee. Incluso la documentación oficial usa URI sin procesar / opacos por esta misma razón. El código correcto sería:Uri.parse("geo:0,0?q=" + Uri.encode("Eiffel Tower"))
bitek
También vea esta respuesta para obtener una explicación de por qué su respuesta no funciona: stackoverflow.com/a/12035226/313113
bitek
0

Una buena solución de Kotlin, utilizando la última respuesta multiplataforma mencionada por lakshman sai ...

Sin embargo, no es necesario Uri.toString y Uri.parse, esta respuesta es limpia y mínima:

 val intentUri = Uri.Builder().apply {
      scheme("https")
      authority("www.google.com")
      appendPath("maps")
      appendPath("dir")
      appendPath("")
      appendQueryParameter("api", "1")
      appendQueryParameter("destination", "${yourLocation.latitude},${yourLocation.longitude}")
 }.build()
 startActivity(Intent(Intent.ACTION_VIEW).apply {
      data = intentUri
 })
Vin Norman
fuente
0

Puede iniciar Direcciones de Google Maps a través de una intención en Android de esta manera

btn_search_route.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String source = et_source.getText().toString();
            String destination = et_destination.getText().toString();

            if (TextUtils.isEmpty(source)) {
                et_source.setError("Enter Soruce point");
            } else if (TextUtils.isEmpty(destination)) {
                et_destination.setError("Enter Destination Point");
            } else {
                String sendstring="http://maps.google.com/maps?saddr=" +
                        source +
                        "&daddr=" +
                        destination;
                Intent intent = new Intent(android.content.Intent.ACTION_VIEW,
                        Uri.parse(sendstring));
                startActivity(intent);
            }
        }

    });
jay patoliya
fuente