Usando o Google Maps e GPS no Android

Postado em 10. abr, 2010 por Ettore Luglio em Mobile

android google 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 2 mil para 9 mil por mês.

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.

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. 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.

Depois desse passo, o Google vai ter 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>

Agora precisamos alterar a nossa atividade 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;
   }
}

No nosso manifesto, 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.

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.

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.

Ettore Luglio

Tags: , ,

33 Respostas para “Usando o Google Maps e GPS no Android”

  1. Paulo Silveira

    10. abr, 2010

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

  2. Fernando Boaglio

    11. abr, 2010

    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. abr, 2010

    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. abr, 2010

    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. abr, 2010

    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. mai, 2010

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

  7. Ettore Luglio

    22. mai, 2010

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

  8. Gabriela

    01. dez, 2010

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

    :(

  9. Ettore Luglio

    01. dez, 2010

    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. jun, 2011

    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. jun, 2011

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

  12. Maisson Martins

    06. jul, 2011

    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. jul, 2011

    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. set, 2011

    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. set, 2011

    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. out, 2011

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

  17. Marcos Almeida

    08. out, 2011

    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. out, 2011

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

  19. Santos

    10. nov, 2011

    Olá,

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

  20. Marcelo H

    30. nov, 2011

    Failed to find style ‘mapViewStyle’ in current theme

  21. Thiago Marinho

    14. dez, 2011

    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. abr, 2012

    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. mai, 2012

    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. jun, 2012

    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. jun, 2012

    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. jul, 2012

    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. ago, 2012

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

  28. Rafael

    17. ago, 2012

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

  29. Cícero Moura

    18. out, 2012

    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. out, 2012

    Sou novato no assunto, ajudou muito.
    Obrigado.

  31. Jeferson

    11. mar, 2013

    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?

Trackbacks/Pingbacks

  1. Usando o Google Maps e GPS no Android « Gabriel Panassol - junho 21, 2010

    [...] no site Caleum CategoriasJava Tags:Android Comentários (0) Trackbacks (0) Deixe um comentário [...]

  2. Rastreamento de celular android via gps | FelipeBastosWeb - agosto 11, 2012

    [...] http://blog.caelum.com.br/usando-o-google-maps-e-gps-no-android/ [...]

Deixar uma Resposta