Como faço para mostrar um marcador no Maps lançado pelo geo URI Intent?

107

Eu tenho um aplicativo onde desejo mostrar diferentes locais (um de cada vez, escolhido pela entrada do usuário), iniciando o Google Maps com suas coordenadas geográficas específicas.

Atualmente estou usando isto (com valores reais de lat. E long., É claro):

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("geo:<lat>,<long>?z=17"));
startActivity(intent);

É exatamente o que eu quero, exceto que não mostra nenhum indicador ou marcador para o ponto especificado. Ele apenas se centra em seu local.

Existe alguma maneira de obter o marcador ou algo mais incluído sem usar um MapView?

Specur
fonte
o rótulo parou de aparecer na atualização de mapas mais recente .. o que fazer?
user2297550

Respostas:

254

Experimente isto:

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("geo:<lat>,<long>?q=<lat>,<long>(Label+Name)"));
startActivity(intent);

Você pode omitir (Marcador + Nome) se não quiser um marcador, e ele escolherá um aleatoriamente com base na rua mais próxima ou outra coisa que julgar relevante.

Kenton Price
fonte
Depois de implementar este URI, tive problemas para definir o zoom. Parece estar obsoleto agora
LuckyMalaka
8
@mmm ...: você precisará alterar o? z para an & z. Você só pode ter um? em um uri. RUIM: geo: N, M? Z = 10? Q = N, M (Local) BOM: geo: N, M? Z = 10 & q = N, M (Local)
Josh
Sem zoom ainda não funciona (mas o rótulo funciona). Além disso, se o Maps não encontrar nada relevante (mesmo que nós o forneçamos com o rótulo), ele mostrará um erro de notificação. Esta solução funciona, mas apenas semi-ótima.
Warpzit
3
O zoom é ignorado porque esta é uma consulta simples, e não um geointent. O que acontece aqui é na verdade uma consulta simples que é enviada ao Google e, em seguida, o servidor responde com um "resultado de pesquisa" correspondente a ela. Você pode tentar pesquisar por <lat>, <long> (Marcador + Nome) em maps.google.com e obter o mesmo resultado
robpvn
4
Usar isso (ou qualquer um dos outros métodos aqui que envolvem uma consulta rotulada) ignora completamente o geoponto na geo:parte, lke robpvn apontou. Em alguns casos, a consulta falhará usando lat / long, e você receberá um brinde "sem resultados" em vez de voltar ao geoponto. Não é muito útil para qualquer tipo de aplicativo GIS.
Geobits
45

A resposta aceita está correta, exceto quando sua etiqueta contém um e comercial (&).

Olhando para um identificador de recurso uniforme para localizações geográficas (URI 'geo') :

A seção 5.1 declara:

se o URI final incluir um componente de 'consulta', adicione o delimitador de componente "?" ao final do resultado, seguido pela string de consulta codificada.

Infelizmente para nós, fazer isso também escapará do '=' que não é o que queremos.

Devemos fazer isso:

String label = "Cinnamon & Toast";
String uriBegin = "geo:12,34";
String query = "12,34(" + label + ")";
String encodedQuery = Uri.encode(query);
String uriString = uriBegin + "?q=" + encodedQuery;
Uri uri = Uri.parse(uriString);
Intent intent = new Intent(android.content.Intent.ACTION_VIEW, uri);
startActivity(intent);
xorgate
fonte
2
Esta funcionalidade foi interrompida no novo Google Maps 7.x, consulte também code.google.com/p/android/issues/detail?id=58507
ATom
42

Existem muito mais opções para lançar um mapa do Google usando uma intenção ...

   Double myLatitude = 44.433106;
   Double myLongitude = 26.103687;
   String labelLocation = "Jorgesys @ Bucharest";

1)

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("geo:<" + myLatitude  + ">,<" + myLongitude + ">?q=<" + myLatitude  + ">,<" + myLongitude + ">(" + labelLocation + ")"));
    startActivity(intent);

2)

String urlAddress = "http://maps.google.com/maps?q="+ myLatitude  +"," + myLongitude +"("+ labelLocation + ")&iwloc=A&hl=es";
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(urlAddress));
    startActivity(intent);

3)

   String urlAddress = "http://maps.googleapis.com/maps/api/streetview?size=500x500&location=" + myLatitude  + "," + myLongitude + "&fov=90&heading=235&pitch=10&sensor=false";
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(urlAddress));
        startActivity(intent);
Jorgesys
fonte
parece que para 2) "& iwloc = A & hl = es" não é realmente necessário
Olivier de Jonge
"iwloc" significa localização da janela de informações e "hl" para o idioma, se você não definir esses valores, os valores padrão serão aplicados. =)
Jorgesys
você perde )na segunda maneira.
Sen
Ups! segunda e terceira opção! obrigado eu consertei os dois! ᕦ ´ • ᴥ • `ᕥ @Baras
Jorgesys
5

Esta string funciona bem para mim:

String geoUriString="geo:"+lat+","+lon+"?q=("+head+")@"+lat+","+lon;
Uri geoUri = Uri.parse(geoUriString);
Log.e(TAG, "String: "+geoUriString);
Intent mapCall  = new Intent(Intent.ACTION_VIEW, geoUri);
startActivity(mapCall);
O HCD
fonte
2

Tente anexar (LocationMarkerName) ao geo: uri. Por exemplo, "geo:,? Z = 17 (LocationMarkerName)"

No Google Maps no Android procurando por 23.0980,30.6797 (NamedMarker), parece centralizar o mapa e posicionar um marcador com o nome NamedMarker nessa posição.

Joshuau
fonte
1

Acabei de confirmar que o seguinte snippet de @Kenton Price ainda funciona no Android 4.4 (KitKat):

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("geo:<lat>,<long>?q=<lat>,<long>(Label+Name)"));
startActivity(intent);
Fate Chang
fonte
0

Só usei sobreposições com o MapView para desenhar marcadores no topo de um mapa. Se a sua visualização está mostrando o seu mapa, pode ser possível simplesmente desenhar o seu marcador no centro da tela, da mesma forma que você desenharia qualquer imagem em uma Visualização.

No entanto, o marcador não estaria vinculado às coordenadas reais do mapa, mas se for apenas uma visualização estática, isso pode servir.

John J Smith
fonte