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.