Respostas:
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 saddr
parâ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.
intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");
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
geo:37.423156,-122.084917?q=37.423156,-122.084917 ...
?
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);
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);
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:
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 .
Bem, você pode tentar abrir o aplicativo interno Android Maps usando o Intent.setClassName
mé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);
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.
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
mapIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Google DirectionsView
com 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, destinationCityName
uma string variável modificou-a conforme necessário.
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);
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
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.
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);
}
<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%20Tower
que 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"))
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
})
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);
}
}
});