Usando o Google Maps e GPS no Android
Postado em 10. abr, 2010 por Ettore Luglio em Mobile
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:
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
33 Respostas para “Usando o Google Maps e GPS no Android”
Trackbacks/Pingbacks
-
-
junho 21, 2010
[...] no site Caleum CategoriasJava Tags:Android Comentários (0) Trackbacks (0) Deixe um comentário [...]
-
-
agosto 11, 2012
[...] http://blog.caelum.com.br/usando-o-google-maps-e-gps-no-android/ [...]

ASSINE NOSSO RSS
Paulo Silveira
10. abr, 2010
e a foto com a caneta da Caelum ao lado deu um quê a mais ao post
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.
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?
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 =/
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
Dante
21. mai, 2010
Pessoal, o meu SDK não está localizando o MapActivity…. que devo fazer?!
Ettore Luglio
22. mai, 2010
Vc deve ter criado um emulador sem a api do google.
Gabriela
01. dez, 2010
Não consigo usar a função Meu Local no Mapa do meu celular, Sony Ericson Xperia X10 mini pro.
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?
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
Rafael
14. jun, 2011
O meu tbm está em saindo em branco por que será?
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.
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.
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
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?
Julio Fazenda
05. out, 2011
Amigo!…
Funcionou aqui, estava atraz de um exemplo prático faz tempo… valewwww abraçosss
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.
Julio Cesar
12. out, 2011
Olá, Sabem me dizer como faço para traçar rota entre dois endereços?
Santos
10. nov, 2011
Olá,
Esse exemplo funciona no emulador? qual a versão?
Marcelo H
30. nov, 2011
Failed to find style ‘mapViewStyle’ in current theme
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
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
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
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!
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 ?
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.
Jessica
13. ago, 2012
Então, funcionou numa boa, mas não aparece a minha localização….. Por que será?
Rafael
17. ago, 2012
Pessoal, fiz tudo o que estava no tutorial, mas o mapa aparece em branco no emulador! O que será?
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…..
Roberto
23. out, 2012
Sou novato no assunto, ajudou muito.
Obrigado.
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?