Usando o Google Maps e GPS no Android

Este é um post criado em 2010 que está sendo atualizado neste ano de 2017. Os ajustes realizados visam a melhora da formatação como também do conteúdo.

O mercado para Android está cada vez mais agitado, e a cada dia aparecem novas informações animadoras: a quantidade de novos aplicativos saltou de 16 mil para 3 milhões desde 2009 pra cá.

Isso não ocorre sem razão. A capacidade de usar os serviços do Google através do Android é excelente. Um dos capítulos mais interessantes do curso FJ-57 de Google Android é o que envolve fazer um mashup com o Google Maps, o GPS do seu celular e dados que gravamos nele.

Essa tarefa se revela inicialmente bastante simples, e depois ainda possibilita inserir uma série de listeners e overlays para poder customizar o uso dos mapas.

Criando o projeto

Dado que você já sabe preparar o ambiente para um HelloWorld no Android, crie uma nova aplicação com uma activity chamada MapasSimples. Você vai precisar adquirir uma API KEY do Google Maps para poder ter a permissão de usá-lo em sua aplicação.

Gerando a chave da API do Maps

Para isso, gere um MD5 da sua chave através do keytool (ou mesmo através do plugin do Android, usando a mesma do procedimento que você usa para assinar suas aplicações) para depois se inscrever no Google Android Maps API Key.

Adicionando o layout do mapa

Depois desse passo, o Google vai te fornecer uma chave de acesso, juntamento com um trecho de XML para ser usado na sua tela. No nosso caso, o main.xml ficará parecido com:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android=
   "http://schemas.android.com/apk/res/android"
     android:orientation="vertical"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
>
<com.google.android.maps.MapView
     android:id="@+id/map_view"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:enabled="true"
     android:clickable="true"
     android:apiKey="SUA CHAVE DO GOOGLE MAPS"
/>
</LinearLayout>

Modificando a nossa activity

Agora precisamos alterar a nossa activity MapasSimples para, em vez de estender Activity, ser filha de MapActivity:

public class MapasSimples extends MapActivity {

   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);
   }

   @Override
   protected boolean isRouteDisplayed() {
       return false;
   }
}

Configurando o manifest

No nosso manifest, precisamos avisar dentro de application que vamos usar a biblioteca do Google Maps:

<uses-library android:name="com.google.android.maps" />

E também precisamos permitir acesso a Internet, dentro da tag de manifest:

<uses-permission android:name=
     "android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name=
     "android.permission.INTERNET" />

Isso já é o suficiente para abrir o Google Maps, mas queremos ir além. Podemos adicionar diversos overlays ao mapa, para colocar informações como as pizzarias mais próximas, a bússola, a nossa posição atual de acordo com o GPS ou mesmo a posição de seus amigos.

Adicionando mais características no mapa

Dentro do método onCreate pode adicionarmos um novo overlay ao mapa, que vai conter tanto a bússola quanto a nossa própria localização (ou de acordo com o GPS ou de acordo com a triangularização de antenas), de maneira simples:

       MapView mapView = (MapView) findViewById(R.id.map_view) ;
       mapView.setClickable(true) ;

       MyLocationOverlay mlo = new MyLocationOverlay(this, mapView) ;
       mlo.enableCompass() ;
       mlo.enableMyLocation() ;
       mapView.getOverlays().add(mlo) ;

Pronto! Você já pode gerar sua aplicação obtendo o seguinte resultado rodando em um celular Google Nexus One:

Caelum Android Google Maps

Você pode incrementar facilmente esse exemplo, como adicionar novos overlays, atualizar sua posição conforme a localização do aparelho, mostrar o trânsito, traçar rotas, além de especificar o seu LocationProvider (GPS ou antena) pelo LocationManager.

O Android ainda possibilita acesso total a recursos do aparelho como câmera, acelerômetro, bluetooth e multitoque, além de APIs ricas para construir sua interface, acessar serviços do aparelho (como ligações e SMS) e APIs do Google como o Maps.

E, através de Web Services, podemos criar um mashup poderoso, misturando informações capturadas da internet com os mapas e outras funcionalidades do aparelho. E tudo usando a sintaxe da linguagem Java.

Se estiver com dificuldades, não deixe de colocar uma dúvida no sistema de dúvidas do GUJ.

O Android é a plataforma mobile que mais cresce no mundo atualmente e a tendência é continuar assim. Com um modelo de programação familiar e recursos poderosos, tem tudo para agradar a comunidade de desenvolvedores.

Para saber mais sobre Android, confira o FJ-57: Desenvolvimento móvel com Google Android e também leia o livro lançado pela Editora Casa do Código.

48 Comentários

  1. Paulo Silveira 10/04/2010 at 20:40 #

    e a foto com a caneta da Caelum ao lado deu um quê a mais ao post 🙂

  2. Fernando Boaglio 11/04/2010 at 23:52 #

    Tentei fazer o exemplo, mas infelizmente ele carrega o mapa em branco, pois não consegue acessar os mapas (I/InetAddress( 1750): Unknown host http://www.google.com, throwing UnknownHostException), apesar de ter o android.permission.INTERNET . Peguei umas dicas dessa thread sem sucesso tb ( http://www.anddev.org/basic_map-application-t24.html ), estou usando o Android 1.6 que é o que meu aparelho suporta.

  3. Paulo Silveira 12/04/2010 at 00:24 #

    Oi Boaglio! Voce recebe a exception no emulador ou no aparelho? Qual é o aparelho exatamente? E pela stacktrace, em que momento ele nao ta conseguindo?

  4. Fernando Boaglio 12/04/2010 at 23:02 #

    Oi, a exception vem do aparelho mesmo, logo que sobe a aplicação. O meu aparelho é um HTC Hero, com Android 1.6 , o update para 2.1 tava previsto pra esse mês, mas a HTC tá enrolando =/

  5. Ricardo Lecheta 16/04/2010 at 10:51 #

    Fala Boaglio

    Eu vi isto apenas no emulador 1.5 e 1.6, no celular nunca ocorreu. Infelizmente provalmente é um bug. Outras pessoas já reportaram problemas parecidos:
    http://code.google.com/p/android/issues/detail?id=2764

    Já tentou fazer um boot no seu celular? No emulador resolve.

    abraço
    Ricardo

  6. Dante 21/05/2010 at 11:46 #

    Pessoal, o meu SDK não está localizando o MapActivity…. que devo fazer?!

  7. Ettore Luglio 22/05/2010 at 19:17 #

    Vc deve ter criado um emulador sem a api do google.

  8. Gabriela 01/12/2010 at 14:09 #

    Não consigo usar a função Meu Local no Mapa do meu celular, Sony Ericson Xperia X10 mini pro.

    🙁

  9. Ettore Luglio 01/12/2010 at 19:05 #

    Olá. Coloque um trecho do seu código que está dando erro. Este código roda no celular de um amigo. O que o LogCat está trazendo?

  10. moises 14/06/2011 at 14:20 #

    Oi Paulo, eu tô usando o emulador com Google APIs 2.2, mas dá erro: “parou inesperadamente”, essa aplicação roda no emulador mesmo ele não tendo GPS? Precisa ser em um celular de verdade?

    Abçs

  11. Rafael 14/06/2011 at 14:47 #

    O meu tbm está em saindo em branco por que será?

  12. Maisson Martins 06/07/2011 at 22:22 #

    Senhores, também tive o mesmo problema que a maioria encontrou e fiz o seguinte no Eclipse pra solucionar:
    Primeiramente deveremos ter a chave privada cedida pelo Google através do MD5 gerado pelo keytool.
    Depois, seguir esse Tutorial do Site do Android:

    Compilar e assinar com Eclipse ADT

    Selecione o projeto no Package Explorer e selecione Arquivo> Exportar .
    Abra a pasta Android, selecione Exportar Aplicação Android, e clique em Avançar .
    O Export Aplicativo para Android assistente agora começa, que irá guiá-lo através do processo de assinatura do aplicativo, incluindo as etapas de seleção da chave privada com a qual a assinar o apk. (Ou criar uma nova chave keystore e privados).
    Concluir o Assistente de Exportação e sua aplicação será compilada, assinado, alinhados e prontos para distribuição.

  13. Maisson Martins 06/07/2011 at 22:31 #

    Ahh, esqueci de complementar…

    No emulador, a aplicação nao exibe o mapa!!
    Para funcionar, eu copiei o arquivo .apk já assinado com minha chave privada e colei numa pasta específica de download no cartão de memória do celular. Em seguida, utilizei o gerenciador de arquivos, ASTRO e instalei o arquivo.apk assinado…
    Somente esse funciona perfeitamente no celular, o que o Eclipse faz, ou seja, o modo de assinatura de depuração do Eclipse, roda no celular como no emulador.

    Lembre-se: Você não pode liberar o seu aplicativo para o público quando assinado com o certificado de depuração.

  14. Leonardo Atripoli 14/09/2011 at 22:06 #

    Fiz todo o procedimento como mencionado, mas já de começo…dá uma exeption:
    The application XXXX(process) has stpped unexpectedly. Please try again.
    este erro ocorre qunado adiciono no main.xml o seguinte código:

    O Apikey esta foi gerado no mesmo pc e valido no site da Google.

    se alguém puder ajudar fico grato

  15. Luiz 17/09/2011 at 10:23 #

    Fiz os mesmos procedimentos, o simulador mostra o mapa, porém, na segunda parte que determina a posição dele e nem a bússola foram mostrados, sabe explicar o motivo?

  16. Julio Fazenda 05/10/2011 at 15:27 #

    Amigo!…
    Funcionou aqui, estava atraz de um exemplo prático faz tempo… valewwww abraçosss

  17. Marcos Almeida 08/10/2011 at 15:17 #

    Ola boa tarde ! Como sou novato no Android, não sei se iso é um problema, vamos lá:

    1º – Montei todo o exemplo acima com uma ressalva, não sei como faço para gerar essa APIKEY ;

    2º – No meu emulador não aparece nada nem mesmo em branco ele fica, isso é normal ?

    Espero que me ajudem.

  18. Julio Cesar 12/10/2011 at 21:50 #

    Olá, Sabem me dizer como faço para traçar rota entre dois endereços?

  19. Santos 10/11/2011 at 16:51 #

    Olá,

    Esse exemplo funciona no emulador? qual a versão?

  20. Marcelo H 30/11/2011 at 16:34 #

    Failed to find style ‘mapViewStyle’ in current theme

  21. Thiago Marinho 14/12/2011 at 12:37 #

    Olá, li agora o post, muito bom por sinal!

    Por acaso, vcs que já brincaram com dev Android tiveram a curiosidade de deixar seu celular (android) em um carro por exemplo, e de outro celular (android) ficar vendo por onde seu celular está “rodando” em tempo real através do google maps utilizando sistema de triangulação (antenas)?

    Estou querendo fazer um projetinho utilizando android, e o sistema de triangulação (que tenho q saber como funciona) para saber onde o ônibus circular (transporte urbano) está no exato momento (endereço) para eu ter noção em que horas q ele vai chegar no ponto de ônibus.

    abraços

  22. Allan 08/04/2012 at 04:48 #

    Olá, tentei seguir os passos do tutorial e não obtive êxito no emulador. A seguir os erros que o logcat identificou. Se puderem me dar uma luz para resolver isso, agradeço imensamente!

    04-08 07:36:59.719: E/AndroidRuntime(795): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:575)
    04-08 07:36:59.719: E/AndroidRuntime(795): at android.view.LayoutInflater.rInflate(LayoutInflater.java:617)
    04-08 07:36:59.719: E/AndroidRuntime(795): at android.view.LayoutInflater.inflate(LayoutInflater.java:407)
    04-08 07:36:59.719: E/AndroidRuntime(795): at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
    04-08 07:36:59.719: E/AndroidRuntime(795): at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
    04-08 07:36:59.719: E/AndroidRuntime(795): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:309)
    04-08 07:36:59.719: E/AndroidRuntime(795): at android.app.Activity.setContentView(Activity.java:1626)
    04-08 07:36:59.719: E/AndroidRuntime(795): at com.gps.testando.GpsActivity.onCreate(GpsActivity.java:11)
    04-08 07:36:59.719: E/AndroidRuntime(795): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
    04-08 07:36:59.719: E/AndroidRuntime(795): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2231)
    04-08 07:36:59.719: E/AndroidRuntime(795): … 11 more
    04-08 07:36:59.719: E/AndroidRuntime(795): Caused by: java.lang.ClassNotFoundException: com.google.android.maps.MapView in loader dalvik.system.PathClassLoader@43597f38
    04-08 07:36:59.719: E/AndroidRuntime(795): at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243)
    04-08 07:36:59.719: E/AndroidRuntime(795): at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
    04-08 07:36:59.719: E/AndroidRuntime(795): at java.lang.ClassLoader.loadClass(ClassLoader.java:532)
    04-08 07:36:59.719: E/AndroidRuntime(795): at android.view.LayoutInflater.createView(LayoutInflater.java:465)
    04-08 07:36:59.719: E/AndroidRuntime(795): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:564)
    04-08 07:36:59.719: E/AndroidRuntime(795): … 20 more
    04-08 07:41:57.301: E/AndroidRuntime(825): Uncaught handler: thread main exiting due to uncaught exception
    04-08 07:41:57.460: E/AndroidRuntime(825): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.gps.testando/com.gps.testando.GpsActivity}: android.view.InflateException: Binary XML file line #9: Error inflating class com.google.android.maps.MapView
    04-08 07:41:57.460: E/AndroidRuntime(825): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2268)
    04-08 07:41:57.460: E/AndroidRuntime(825): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2284)
    04-08 07:41:57.460: E/AndroidRuntime(825): at android.app.ActivityThread.access$1800(ActivityThread.java:112)
    04-08 07:41:57.460: E/AndroidRuntime(825): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1692)
    04-08 07:41:57.460: E/AndroidRuntime(825): at android.os.Handler.dispatchMessage(Handler.java:99)
    04-08 07:41:57.460: E/AndroidRuntime(825): at android.os.Looper.loop(Looper.java:123)
    04-08 07:41:57.460: E/AndroidRuntime(825): at android.app.ActivityThread.main(ActivityThread.java:3948)
    04-08 07:41:57.460: E/AndroidRuntime(825): at java.lang.reflect.Method.invokeNative(Native Method)
    04-08 07:41:57.460: E/AndroidRuntime(825): at java.lang.reflect.Method.invoke(Method.java:521)
    04-08 07:41:57.460: E/AndroidRuntime(825): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
    04-08 07:41:57.460: E/AndroidRuntime(825): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
    04-08 07:41:57.460: E/AndroidRuntime(825): at dalvik.system.NativeStart.main(Native Method)
    04-08 07:41:57.460: E/AndroidRuntime(825): Caused by: android.view.InflateException: Binary XML file line #9: Error inflating class com.google.android.maps.MapView
    04-08 07:41:57.460: E/AndroidRuntime(825): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:575)
    04-08 07:41:57.460: E/AndroidRuntime(825): at android.view.LayoutInflater.rInflate(LayoutInflater.java:617)
    04-08 07:41:57.460: E/AndroidRuntime(825): at android.view.LayoutInflater.inflate(LayoutInflater.java:407)
    04-08 07:41:57.460: E/AndroidRuntime(825): at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
    04-08 07:41:57.460: E/AndroidRuntime(825): at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
    04-08 07:41:57.460: E/AndroidRuntime(825): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:309)
    04-08 07:41:57.460: E/AndroidRuntime(825): at android.app.Activity.setContentView(Activity.java:1626)
    04-08 07:41:57.460: E/AndroidRuntime(825): at com.gps.testando.GpsActivity.onCreate(GpsActivity.java:11)
    04-08 07:41:57.460: E/AndroidRuntime(825): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
    04-08 07:41:57.460: E/AndroidRuntime(825): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2231)
    04-08 07:41:57.460: E/AndroidRuntime(825): … 11 more
    04-08 07:41:57.460: E/AndroidRuntime(825): Caused by: java.lang.ClassNotFoundException: com.google.android.maps.MapView in loader dalvik.system.PathClassLoader@43735560
    04-08 07:41:57.460: E/AndroidRuntime(825): at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243)
    04-08 07:41:57.460: E/AndroidRuntime(825): at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
    04-08 07:41:57.460: E/AndroidRuntime(825): at java.lang.ClassLoader.loadClass(ClassLoader.java:532)
    04-08 07:41:57.460: E/AndroidRuntime(825): at android.view.LayoutInflater.createView(LayoutInflater.java:465)
    04-08 07:41:57.460: E/AndroidRuntime(825): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:564)
    04-08 07:41:57.460: E/AndroidRuntime(825): … 20 more

  23. Ruy Mesquita 04/05/2012 at 17:47 #

    Thiago Marinho.

    Estou fazendo um trabalho com triangulação em Android, se quiser posso te dar umas dicas, mais informo que a triangulação é muito imprecisa. Qqr coisa é só mandar e-mail, ruy.mesquita[at]globomail[dot]com

  24. Thiago Marinho 09/06/2012 at 11:30 #

    Obrigado Ruy, já entramos em contato, já me ajudou bastante!

    Quem estiver começando com #Android, e quiser um passo a passo de como assinar uma aplicação, segue o link do meu blog:

    http://tgmarinho.wordpress.com/2012/06/03/certificado-digital-chave-valida-google-maps-assinar-app/

    Abraço!

  25. Carlos Eduardo 27/06/2012 at 10:35 #

    bom dia

    realizei todo processo como foi descrito no tutorial, e fui rodar a aplicação no meu celular (sansung galaxy ace) e o maps continuou aparecendo em branco. Alguém sabe o motivo ?

  26. Williams 24/07/2012 at 15:09 #

    Muito bom tutorial, mas tenho uma dúvida.
    Tem como eu carregar um mapa no android a partir de um link?
    Tenho uma rota salva na web que queria carregar na minha aplicação android.

  27. Jessica 13/08/2012 at 14:46 #

    Então, funcionou numa boa, mas não aparece a minha localização….. Por que será?

  28. Rafael 17/08/2012 at 15:13 #

    Pessoal, fiz tudo o que estava no tutorial, mas o mapa aparece em branco no emulador! O que será?

  29. Cícero Moura 18/10/2012 at 10:43 #

    Poxa =/, fiz tudo que ensinaram aqui e em um monte de lugar na internet, mas o único certificado que consigo gerar com esses comandos é o SHA1, nada de MD5. Usei um app que se chama “Checksum MD5 & SHA1” que promete gerar os certificados. Gerei por ele e o Google aceitou, basta testar agora se o mapa vai aparecer…..

  30. Roberto 23/10/2012 at 13:52 #

    Sou novato no assunto, ajudou muito.
    Obrigado.

  31. Jeferson 11/03/2013 at 15:45 #

    Boa tarde.
    Eu consegui assinar como desenvolver usando minha MD5,mas, para minha “sorte” minha MD5 mudou completamente, como faço agora para alterar a assinatura MD5?

  32. Lord 13/08/2013 at 16:04 #

    Um modo mais simpes para acessar sua SHA1 ou MD5 atraves do Eclipse é ir no Window / Preferences / Android / Build …vai aparecer seus valores…SHA1 e MD5

  33. Paulo 22/08/2013 at 17:36 #

    estou com um problema não consigo usar o
    android:enable
    android:apiKei
    no meu xml o que preciso fazer para funcionar na minha aplicação

  34. Alexandre 14/10/2013 at 00:42 #

    Gente, bom dia!

    Gostaria de saber se é possivel criar para um site a localização em tempo real do gps de um android no google maps?

    Como se fosse um rastreamento do entregadores para que o cliente possa saber sua atual localização

  35. Egberto 19/12/2013 at 12:10 #

    muito bom o post, aproveitando se alguem souber me responder eu agradeço. Como funciona a limitação do Google Maps, toda vez que informo umas coordenadas (latitude e longitude) e projeto no google maps é contado com uma requisição??? Na documentação informa que você pode obter 25000 por dia , isso e referente a aplicacao que desenvolver devido a chave informada?? Como faço por exemplo : minha aplicação ser usada por 1 milhao de pessoa e não parar a aplicação visto que o limite dia é 25000.

  36. Danilo Siqueira 16/02/2014 at 20:30 #

    Aí galera, também apanhei muito. Muito bom este artigo, mas ele já está defasado, pois ele ensina como adicionar um mapa V1 e o google já não gerar mais chaves para esta versão. A nova versão agora e a 2 segue um link do google e de um vídeo que acompanhei para fazer funcionar.

    https://developers.google.com/maps/documentation/android/start#getting_the_google_maps_android_api_v2

  37. Paulo 17/04/2014 at 16:26 #

    Existe limite de markers na api do google? Eu tenho que colocar um pouco mais que 10.000 markers no mapa isso é possível?

  38. Gustavo Bitencourt 18/06/2014 at 17:08 #

    Olá,
    Saberia me dizer se é possível eu manipular os dados dentro do mapa?
    Ou seja, é possível fixar um ponto e ver todas as cidades ao lado desse ponto?

    Obrigado!

  39. Wender 29/03/2016 at 13:20 #

    Ola, estou querendo aprender a programar pelo Android Studio e gostaria de saber se alguém tem um código parecido com esse para o Android Studio?

  40. Felipe 09/11/2016 at 22:09 #

    alguem sabe me dizer como eu eu devio a rota ??

    eu preciso desviar a rota dos meu marcadores

  41. Alifi 03/11/2017 at 17:40 #

    Alguém poderia me ajudar em como traçar uma rota? Obrigado!

Deixe uma resposta