Iniciar rotas do Google Maps via intenção no Android


Respostas:


630

Você poderia usar algo como isto:

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 a navegação a partir do local atual, remova o saddrparâmetro e o valor.

Você pode usar um endereço real, em vez de latitude e longitude. No entanto, isso dará ao usuário uma caixa de diálogo para escolher entre abri-la via navegador ou Google Maps.

Isso acionará o Google Maps diretamente no modo de navegação:

Intent intent = new Intent(android.content.Intent.ACTION_VIEW,
    Uri.parse("google.navigation:q=an+address+city"));

ATUALIZAR

Em maio de 2017, o Google lançou a nova API para URLs universais do Google Maps em várias plataformas:

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

Você também pode usar o Intents com a nova API.


2
Não que eu esteja ciente. No entanto, não haverá caixa de diálogo se o usuário já tiver escolhido o aplicativo padrão para abrir esse tipo de intenções para ser o aplicativo de mapa.
— Jan S.

111
Se você quiser se livrar da caixa de diálogo, pode dar uma dica sobre a intenção de qual pacote você deseja usar. Antes do startActivity () adicione isto:intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");
— Jeremy Logan

e como forçar para mostrá-lo no navegador e não no aplicativo googlemaps?
— NullPointerException

68
Forçar o usuário a uma atividade específica, quando eles podem ter outros aplicativos que preferem, parece contrário ao espírito do Android para mim. Eu ficaria tentado a deixar que os filtros de intenção cuidassem das coisas aqui.
— superluminary

15
As intenções de navegação parecem ser oficialmente suportadas agora: developers.google.com/maps/documentation/android/…
— Sanketh Katta 15/15

124

Isso é um pouco estranho, porque você solicitou "instruções", mas também pode usar o esquema de URI geográfico descrito na documentação do Android:

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

O problema ao usar "localização geográfica: latitude, longitude" é que o Google Maps é centralizado apenas no seu ponto, sem nenhum alfinete ou etiqueta.

Isso é bastante confuso, especialmente se você precisar apontar para um local preciso ou pedir orientações.

Se você usar o parâmetro de consulta "geo: lat, lon? Q = name" para rotular seu ponto geográfico, ele utilizará a consulta para pesquisar e descartar os parâmetros lat / lon.

Encontrei uma maneira de centralizar o mapa com lat / lon e exibir um alfinete com um rótulo personalizado, muito agradável de exibir e útil ao pedir instruções ou qualquer outra ação:

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): Não está funcionando no Maps v.7 (versão mais recente no momento da redação). Irá ignorar as coordenadas e buscará um objeto com o nome dado entre parênteses. Consulte também Intent for Google Maps 7.0.0 com localização


3
Bom, a localização geográfica padrão: 0,0 apenas move o mapa para lá. Esta solução ["geo: 0,0? Q = 37.423156, -122.084917 (" + nome + ")"] permite que você insira seu próprio nome de marcador. Obrigado.
— Gnac 31/08/11

4
Funciona muito bem - fyi não aparece para trabalhar em conjunto com o parâmetro "z" consulta (nível de zoom)
— scolestock

11
É possível definir o modo de trânsito padrão na intenção. Por padrão, a opção carro está selecionada. Posso definir Walking como o modo padrão?
— Urso

6
Por que você não usa geo:37.423156,-122.084917?q=37.423156,-122.084917 ...?
— rekire

11
Certifique-se de codificar o parâmetro label. Eu tive problemas com caracteres especiais, como espaço.
— Ethan

100

Embora as respostas atuais sejam ótimas, nenhuma delas fez exatamente o que eu estava procurando, eu queria abrir apenas o aplicativo de mapas, adicionar um nome para cada local de origem e destino, usar o esquema de URI geográfico não funcionaria para mim e o link da web de mapas não tinha rótulos, então eu vim com essa solução, que é essencialmente uma amálgama das outras soluções e comentários feitos aqui, espero que seja útil para outras pessoas que visualizam essa pergunta.

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 sua localização atual como ponto de partida (infelizmente não encontrei uma maneira de rotular a localização atual), use o seguinte

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 garantir a integridade, se o usuário não tiver o aplicativo de mapas instalado, será uma boa ideia capturar a ActivityNotFoundException. Podemos iniciar a atividade novamente sem a restrição do aplicativo de mapas, podemos ter certeza de que nunca obteremos para o Toast no final, já que um navegador da Internet é um aplicativo válido para iniciar esse esquema de URL também.

        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();
            }
        }

PS Quaisquer latitudes ou longitudes usadas no meu exemplo não são representativas da minha localização, qualquer semelhança com uma localização verdadeira é pura coincidência, ou seja, eu não sou da África: P

EDITAR:

Para obter instruções, agora uma intenção de navegação é suportada com 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);

2
Esta é uma ótima resposta, David! Você também sabe como realmente iniciar a navegação enquanto estiver dentro do aplicativo de navegação? No estado atual, o usuário precisa clicar em 'Iniciar navegação' uma última vez. Eu procurei no Google por algum parâmetro para passar, mas não consegui encontrar nenhum.
— Nirmal

Ao pressionar o botão voltar do aplicativo de mapas, é exibida uma tela preta e a atividade subjacente é recriada. Alguma idéia de como corrigir isso?
— Jas

@Jas remove o método intent.setclassname
— Ameen Maheen

Olá, o código acima está demorando muito para iniciar o aplicativo de mapa padrão nas versões 4.4.2, 4.4.4 e 5.0.2 do Android. Seu lançamento está bem nas versões 5.1 e Marshmallow. Você poderia ajudar a resolver esse problema.
— OnePunchMan 5/17

Agora, eu sugeriria o uso de intent.SetPackage em vez de intent.setClassName ("com.google.android.apps.maps", "com.google.android.maps.MapsActivity"); Vou atualizar a resposta para refletir isso.
— David Thompson

22

Usando os URLs mais recentes do Google Maps para várias plataformas : Mesmo se o aplicativo do Google Maps estiver ausente, ele será aberto no navegador

Exemplo 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);

10

Abra o Google Maps usando Intent com diferentes modos:

Podemos abrir o aplicativo Google Maps usando a intenção:

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)

Aqui, "mode = b" é para bicicleta.

Podemos definir o modo de dirigir, caminhar e andar de bicicleta usando:

  • d para dirigir
  • w para caminhar
  • b para andar de bicicleta

Você pode encontrar mais informações sobre a intenção no Google Maps aqui .

Nota: Se não houver rota para a bicicleta / carro / caminhada, será exibido "Não é possível encontrar o caminho até lá"

Você pode conferir minha resposta original aqui .


8

Bem, você pode tentar abrir o aplicativo interno Android Maps usando o 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);

6

Para vários pontos de passagem, também pode ser utilizado o seguinte.

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);

O primeiro conjunto de coordenadas é a sua localização inicial. Todos os próximos são pontos de passagem, a rota plotada passa.

Continue adicionando pontos de passagem, concordando "/ latitude, longitude" no final. Aparentemente, há um limite de 23 pontos de acordo com o Google Docs . Não tenho certeza se isso se aplica ao Android também.


O que não está funcionando? O que você está vendo ao executar esse código exato?
— Adeel Tariq

Na verdade, não use as coordenadas exatas que coloquei aqui. Eles estão no meio do nada, em algum lugar sem estradas por perto, para que não funcionem.
— Adeel Tariq

4

Se você estiver interessado em mostrar a latitude e longitude da direção atual, poderá usar o seguinte:

As instruções são sempre fornecidas a partir da localização atual dos usuários.

A consulta a seguir ajudará você a fazer isso. Você pode passar a latitude e longitude de destino aqui:

google.navigation:q=latitude,longitude

Use acima 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);

Ou, se você deseja mostrar via local, use:

google.navigation:q=a+street+address

Mais informações aqui: Google Maps Intents para Android


para as instruções para o trabalho, eu precisava para adicionarmapIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
— alguém em algum lugar

4

Google DirectionsViewcom o local de origem como local atual e o local de destino como uma string

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);
}

No acima, destinationCityNameuma string variável modificou-a conforme necessário.


3

tente isso

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);

3

Isto é o que funcionou para mim:

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);
}

1

se você conhece o ponto A, o ponto B (e quaisquer recursos ou faixas intermediárias), você pode usar um arquivo KML junto com sua intenção.

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 obter mais informações, consulte esta resposta do SO

NOTA: este exemplo usa um arquivo de amostra que (a partir de mar13) ainda está online. se ficar offline, encontre um arquivo kml online e altere seu URL


11
Ao pressionar o botão voltar do aplicativo de mapas, é exibida uma tela preta e a atividade subjacente é recriada. Alguma idéia de como corrigir isso?
— Jas

@ Jas, o Google alterou muitas de suas APIs e esse comportamento talvez tenha mudado também. Estou usando mapas de ruas abertos exclusivamente há algum tempo, para poder ajudá-lo. :)
— gil tony

0

Primeiro, você precisa agora que pode usar a intenção implícita. A documentação do Android nos fornece intenções comuns muito detalhadas para implementar a intenção do mapa. É necessário criar uma nova intenção com dois parâmetros.

  • Açao
  • Uri

Para a ação que podemos usar Intent.ACTION_VIEW e para o Uri, devemos construí-lo, abaixo anexei um código de exemplo para criar, construir, iniciar a atividade.

 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);
    }

11
O uso do Uri.Builder funciona apenas para URIs absolutos, na forma de:, URIs <scheme>://<authority><absolute path>?<query>#<fragment>não opacos <scheme>:<opaque part>#<fragment>. O código acima gera o seguinte URI: o geo:/0%2C0?Eiffel%20Towerque causa a falha do aplicativo Google Maps. Até a documentação oficial usa URIs brutos / opacos por esse motivo. O código correto seria:Uri.parse("geo:0,0?q=" + Uri.encode("Eiffel Tower"))
— bitek

Veja também esta resposta para uma explicação de por que a sua resposta não funciona: stackoverflow.com/a/12035226/313113
— Bitek

0

Uma boa solução kotlin, usando a mais recente resposta multiplataforma mencionada por lakshman sai ...

Porém, sem Uri.toString e Uri.parse desnecessários, essa resposta é limpa e 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
 })

0

Você pode iniciar as direções do Google Maps por uma intenção no Android dessa maneira

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);
            }
        }

    });
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.