Obtendo Endereços Com Geocoder em Location API Android - Parte 3

Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba grátis conteúdos Android sem precedentes! Você receberá um email de confirmação. Somente depois de confirma-lo é que eu poderei lhe enviar os conteúdos semanais exclusivos. Os artigos em PDF são entregues somente para os inscritos na lista.

Email inválido.
Blog /Android /Obtendo Endereços Com Geocoder em Location API Android - Parte 3

Obtendo Endereços Com Geocoder em Location API Android - Parte 3

Vinícius Thiengo
(9478) (26)
Go-ahead
"O método consciente de tentativa e erro é mais bem-sucedido que o planejamento de um gênio isolado."
Peter Skillman
Prototipagem Android
Capa do curso Prototipagem Profissional de Aplicativos
TítuloAndroid: Prototipagem Profissional de Aplicativos
CategoriasAndroid, Design, Protótipo
AutorVinícius Thiengo
Vídeo aulas186
Tempo15 horas
ExercíciosSim
CertificadoSim
Acessar Curso
Quer aprender a programar para Android? Acesse abaixo o curso gratuito no Blog.
Lendo
TítuloManual de DevOps: como obter agilidade, confiabilidade e segurança em organizações tecnológicas
CategoriaEngenharia de Software
Autor(es)Gene Kim, Jez Humble, John Willis, Patrick Debois
EditoraAlta Books
Edição
Ano2018
Páginas464
Conteúdo Exclusivo
Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba gratuitamente conteúdos Android sem precedentes!
Email inválido

Tudo bem?

Nesta terceira parte da série de artigos (vídeos) sobre a Location API no Android vamos destrinchar uma maneira simples de "como obter o endereço de um local especifico" utilizando a classe Geocoder, uma das importantes classes presentes no pacote de APIs da Android Location API.

Aplicativo Android com a Geocoder API em teste

Apesar da documentação ressaltar a utilização do provedor FINE_LOCATION, apesar disso é possível trabalhar a API Geocoder com o provedor FUSED_PROVIDER (neste caso não haverá uso do recurso GPS).

Porém o resultado tende a ser desastroso, pois sem o uso de GPS a localidade obtida tende a ser bem distante da localização real do aparelho.

Logo, ao menos para a obtenção de endereços com alta acurácia, é inteligente seguir a dica da documentação oficial e utilizar dados providos pelo provedor FINE_LOCATION (que faz uso do recurso GPS).

E caso o GPS não esteja ativo desde o início da solicitação de coordenadas com o provedor FINE_LOCATION, então é possível solicitar a ativação deste recurso ao usuário. Uma simples Intent faz isso por nós (essa configuração de intenção também será apresentada em vídeo).

Note que devido às chamadas do objeto Geocoder aos métodos de captura de informação serem síncronas e ao mesmo tempo consumirem recursos de comunicação remota (conexão com a Internet).

Devido a isso:

Estas chamadas a esses métodos devem ocorrer fora da Thread Principal.

No vídeo essas chamadas ocorrem dentro de uma Worker Thread, mais precisamente dentro do método onHandleIntent() de um IntentService.

No vídeo eu explico melhor porque optei por um IntentService ao invés de um Service.

E, já adiantando, os métodos Geocoder de obtenção de informação de endereço são:

  • getFromLocation();
  • getFromLocationName();
  • getFromLocationName().

No vídeo vamos utilizar a biblioteca EventBus para comunicação com o IntentService.

Mas, como exercício de evolução no desenvolvimento Android, tente também a implementação com o ResultReceiver e com o LocalBroadcastManager. Alias, a melhor escolha, acredite, é o LocalBroadcastManager e não a EventBus API.

Uma outra implementação de exercício que você pode estar testando é a dos métodos de resultado da classe Address. Verifique, por exemplo, quais realmente são retornados e quais são iguais a null.

Antes de finalizar, abaixo deixo alguns links de outros conteúdos do Blog que lhe colocarão em dia com o que há de mais atual no mundo do desenvolvimento de aplicativos Android:

E caso você tenha como meta aprender a criar aplicativos Android, ou evoluir nesta área, também com o conteúdo gratuito do Blog e canal, então não deixe de acessar a lista de estudos gratuita e exclusiva:

Não esqueça de se inscrever 📫na lista de e-mails do Blog para receber os conteúdos Android em primeira mão e também em formato PDF (esse formato é liberado somente para os inscritos na lista de e-mails).

Se inscreva também no canal do Blog no YouTube para acompanhar as últimas novidades.

Surgindo dúvidas ou dicas, pode enviar abaixo na área de comentários que logo eu lhe retorno.

Obs. : o link para download do projeto apresentado em vídeo se encontra logo abaixo no artigo, mais precisamente na seção "Download".

Abraço.

Dica importante

Quando vejo desenvolvedores estudando APIs de obtenção de coordenadas, logo me vem a cabeça 🤔 se uma intenção do Google Maps já não seria o suficiente.

Sendo assim, depois de consumir este artigo não deixe de também conhecer essa ferramenta sensacional e nativa Android:

Versão do Android Studio IDE

Apesar da versão do Android Studio IDE no vídeo não ser a mais atual disponível, isso não deve ser um empecilho para você estudar a Location API por está série de conteúdos.

Até porque a versão do Android Studio não influencia em nada em quais APIs serão utilizadas e como essas serão trabalhadas em código.

Logo, siga tranquilo(a) o tutorial com a versão Android Studio que você tem em seu ambiente de desenvolvimento.

AndroidX

Apesar do conteúdo sobre a Location API ainda estar atual e ser importante para qualquer nível de desenvolvedor Android.

Apesar disso eu também recomendo, assim que finalizado o projeto em sua própria instalação de IDE, que você o migre para o AndroidX (caso ainda não tenha feito).

Algo que pode ser realizado com poucos cliques, como apresentado no tutorial a seguir: Migrar para o AndroidX.

Aula anterior

Como informado no início desta postagem, este artigo (vídeo) é a Parte 3 de uma série de cinco partes.

A aula anterior é a:

Próxima aula

A próxima aula é a:

É importante que você siga as aulas na ordem correta para assim poder tirar o máximo da série e então evoluir, como esperado, no mundo de desenvolvimento de aplicativos Android.

Fontes

runOnUiThread, Atalho de Acesso a Thread Principal no Android

Exibir o endereço de um local

Documentação oficial Geocoder Android

Documentação oficial Address Android

Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba grátis conteúdos Android sem precedentes!
Email inválido

Relacionado

Slides no Android Com a Lib AndroidImageSliderSlides no Android Com a Lib AndroidImageSliderAndroid
Ícones Com Bootstrap Lib no AndroidÍcones Com Bootstrap Lib no AndroidAndroid
Carregando Dados no ListView Com OnScrollListener e Volley no AndroidCarregando Dados no ListView Com OnScrollListener e Volley no AndroidAndroid
Notificação Interna Com a Lib Crouton no AndroidNotificação Interna Com a Lib Crouton no AndroidAndroid

Compartilhar

Comentários Facebook

Comentários Blog (26)

Para código / script, coloque entre [code] e [/code] para receber marcação especifica.
Forneça seu nome válido.
Forneça seu email válido.
Forneça o comentário.
Enviando, aguarde...
09/08/2017
Tens algum exemplo mostrando o uso do "Places API" com auto complete ?
Responder
Vinícius Thiengo (1) (0)
09/08/2017
Avelino, tudo bem?

Ainda não tenho esse conteúdo aqui no Blog. O que posso lhe indicar por enquanto são as APIs de place no Android-Arsenal:

https://android-arsenal.com/tag/59?sort=rating

E a própria documentação da API no Android: https://developers.google.com/places/android-api/?hl=pt-br

Abraço.
Responder
03/05/2017
Opa, tudo bem?
Deixo te perguntar uma coisa, sobre o Geocoder, eu consigo identificar se naquela localização é uma casa, loja, shopping ou bar? Por exemplo, obter a longitude e latitude, passei os parâmetros para o geocoder. Com isso ele trás o nome do endereço, cidade, estados e outras informações, mas falando se é uma casa ou loja não?
Se não é possível, sabe me dizer se existe alguma maneira?
Agradeço desde já, muito obrigado e parabéns pelos vídeos.
Responder
Vinícius Thiengo (1) (0)
07/05/2017
Diogo, tudo bem?

O que tem de saber é que: pode ser que alguns locais tenham também essa informação, se é casa, prédio, padaria, ?

Não são todos os lugares que nos servidores do Google Maps há as informações completas. Se me lembro bem o Geocoder não lhe fornece isso.

Veja se a Places API lhe esclarece melhor como conseguir essas informações mais precisas, até mesmo se realmente é possível. Veja a documentação dela no link a seguir: https://developers.google.com/places/android-api/?hl=pt-br

Abraço.
Responder
10/05/2017
Vinicius, muito obrigado pelo retorno e confesso que não sabia do Place API.
Vou olhar agora mesmo. Vlwww e abraço
Responder
29/06/2016
Oi Vinicius,

Seu código funciona perfeitamente para exibir a latitute e longitude, mas gostaria de ver um marker no mapa e não estou conseguindo colocar.
Queria pegar essas coordenadas e conseguir ver no mapa.
Sempre dá o mesmo erro:
06-29 15:12:52.287 32679-32679/br.com.thiengo.exampleapilocation E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                   Process: br.com.thiengo.exampleapilocation, PID: 32679
                                                                                   java.lang.NullPointerException
                                                                                       at br.com.thiengo.exampleapilocation.MainActivity.onConnected(MainActivity.java:83)
                                                                                       at com.google.android.gms.common.internal.zzk.zzh(Unknown Source)
                                                                                       at com.google.android.gms.internal.zzlg.zznU(Unknown Source)
                                                                                       at com.google.android.gms.internal.zzlg.onConnected(Unknown Source)
                                                                                       at com.google.android.gms.internal.zzli$2.onConnected(Unknown Source)
                                                                                       at com.google.android.gms.common.internal.zzj$zzg.zzpf(Unknown Source)
                                                                                       at com.google.android.gms.common.internal.zzj$zza.zzc(Unknown Source)
                                                                                       at com.google.android.gms.common.internal.zzj$zza.zzt(Unknown Source)
                                                                                       at com.google.android.gms.common.internal.zzj$zzc.zzph(Unknown Source)
                                                                                       at com.google.android.gms.common.internal.zzj$zzb.handleMessage(Unknown Source)
                                                                                       at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                       at android.os.Looper.loop(Looper.java:136)
                                                                                       at android.app.ActivityThread.main(ActivityThread.java:5095)
                                                                                       at java.lang.reflect.Method.invokeNative(Native Method)
                                                                                       at java.lang.reflect.Method.invoke(Method.java:515)
                                                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
                                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
                                                                                       at dalvik.system.NativeStart.main(Native Method)

Você consegue ajudar?
Inseri essas linhas:

private GoogleMap mMaps;
private LatLng latlng;
LatLng me = new LatLng(l.getLatitude(), l.getLongitude());
            mMaps.addMarker(new MarkerOptions().position(me).title("Marker in me"));
            mMaps.moveCamera(CameraUpdateFactory.newLatLng(me));
Responder
Vinícius Thiengo (0) (0)
02/07/2016
Fala Tais, blz?
Qual é sua linha 83? Vc provavelmente deve estar colocando referências no Maps antes dele ter sido carregado, tente um delay dentro de uma thread secundária somente como teste para saber se é esse mesmo o problema. Abraço
Responder
Jonatas Oliveira (1) (0)
31/03/2015
Aew Thiengo blz?

Cara seus videos estao sendo muito uteis valeu. No entanto eu empaquei nesse video, estou precisando retornar a cidade atual aparti das coordenadas.
E estou tendo problemas no "runOnUiThread". Esta aparecendo como erro nessa linha, ele que vem dentro do metodo onEvent.
Eu estou utilizando a lib EventBus e o eclipse.
Agradeço qualquer luz.

Abraço
Responder
Vinícius Thiengo (0) (0)
01/04/2015
Fala Jonas, blz sim.
Tente dessa forma

NomeDaActivity.this.runOnUiThread(...código aqui...);

Abraço
Responder
Jonatas Oliveira (1) (0)
01/04/2015
Aew thiengo,

mas é claro rsrs,
Usei getActivity() pois estou trabalhando com fragment.
Valw, abraço
Responder
Vinícius Thiengo (0) (0)
01/04/2015
Funcionou?
Responder
Jonatas Oliveira (1) (0)
07/04/2015
Funcionou sim
Responder
joaoajm (1) (0)
22/03/2015
thiengo como faço para saber se o dispositivo está perto de um determinado local ? por exemplo preciso saber se o meu dispositivo está perto da minha casa, no caso eu teria que ter as coordenadas da minha casa correto ? e como eu faria para comparar essas coordenadas e saber se o dispositivo está próximo ou não
Responder
Vinícius Thiengo (1) (0)
23/03/2015
Fala João, blz?
Esse vídeo coloco hj no ar, exatamente mostrando como encontrar locais mais próximos. Como está no vídeo 3 imagino que viu os dois anteriores, logo veja o vídeo do JobScheduler e o vídeo 4 da série, para não ficar meio perdido no vídeo que coloco hj sobre encontrar locais mais próximos. Basicamente o trabalho é feito mesmo em seu banco de dados, onde estão tb as coordenadas dos places já cadastrados, depois é somente utilizar um busca com filtro implementado o calculo de distancia em dois pares de coordenadas (para cada coordenada no bd), acho que com o vídeo ficará mais claro. Abraço
Responder
João Arthur (1) (0)
23/03/2015
Obrigado Thiengo, e mais uma vez parabéns pelo conteúdo, sempre ajudando a comunidade abraço.
Responder
07/03/2015
Parabéns Thiengo muito bom, você poderia explicar como converter objeto LatLng em String ou Double p/ gravar no bando de dados, e depois novamente converter esses valores? Obrigado.
Responder
Vinícius Thiengo (1) (0)
08/03/2015
Fala José, blz?
Vou sim fazer um vídeo similar, porém utilizando a classe Location, pois o Location API não utiliza o LatLng, mas o trabalho é o mesmo. Abraço
Responder
leandrox364 (1) (0)
05/03/2015
Cara so tenho a parabenizar e agradecer por voce esse otimo trabalho.
Responder
Vinícius Thiengo (0) (0)
06/03/2015
Vlw Leandro, abraço
Responder
02/03/2015
Olá Thiengo, tenho algumas dúvidas sobre essa api do google, como ela funciona na verdade? Você diz que ele usa o GPS mais não vejo ele usar o GPS pelo seguinte fato: quando usamos o GPS ele começa a piscar na barra superior certo? 'tipo uma notificação' se eu estiver errado me corrija ! quando uso o LocationListener o GPS pisca 'fica uma notificação dizendo obtendo endereço' e essa api do google não funciona assim, outra dúvida ela o funciona só se tiver internet? bom usei essa api do google mais ela começou a me dar problemas do tipo só me gerava a ultima localização, ex: se eu verificasse a minha latitude e longitude na minha casa ele me dava tudo certinho mais testei indo pra faculdade e trabalho e ele não atualizou estava com a mesma latitude e longitude da minha casa.(só relatando um problema que tive com essa api)
Responder
Vinícius Thiengo (0) (0)
03/03/2015
Fala Alessandro, blz?
Na verdade essa API utiliza um provider diferente, no LocationListener nós escolhemos entre GPS_PROVIDER ou NETWORK_PROVIDER, ou ambos, no Location API temos o FUSED_PROVIDER, que tem como principal característica obter a melhor localização disponivel no aparelho, se o GPS estiver ativado ele tentará obter da tecnologia de GPS, consequentemente tendo resultados mais precisos, porém se o GPS não estiver ativado ou se estiver mt lento para responder ele pode utilizar a localização obtida por meio de triangulação de antenas ou até mesmo pela conexão Wi-Fi, perdendo assim em muito na precisão... ou seja, o que tiver disponível de melhor é o que ele utiliza. É praticamente a mesma coisa quando temos o LocationListener e precisamos de uma Localização de imediato, devido ao tempo que o GPS pode ter para responder começamos obtendo os dados do NETWORK_PROVIDER que é bem menos preciso.

Em seu teste a permission de FINE_LOCATION estava definida no AndroidManifest.xml? Na documentação não indica nada de que há a necessidade de Internet, até pq o GPS trabalha sem essa necessidade. Se o GPS estiver desativado ele realmente não o utilizará (ficar com o sinal de GPS na barra de notificações, ele faz isso tb), tendo em mente que o LocationListener tb não o utiliza se ele estiver desativado, porém se o GPS estiver apenas em standby ele tende a utiliza-lo se o FINE_LOCATION estiver definido no AndroidManifest.xml. Vlw por reportar o problema, vou relizar alguns testes aqui tb. Abraço
Responder
03/03/2015
Sim, estava tudo certinho meu projeto inclusive com o FINE_LOCATION no AndroidManifest.xml, mais obrigado por responder e parabéns pelas aulas ajuda muito.
Responder
03/03/2015
As API's da google sempre vão dar preferencia a conexão com a internet para busca de coordenadas, faça o teste no seu aplicativo, desligue todas as conexões e ligue apenas o GPS, você verá que o sinal do GPS irá piscar por alguns segundos, caso isso não aconteça é porque a API identificou que você tem uma "lastLocation" em cache no SO Android, e ele irá utilizar a mesma, por isso que no seu método de localização, como teste sempre remova as ultimas localizações do cliente pelo removeUpdates, e não chame o lastLocation, assim você força uma localização nova a partir do hardware GPS.
Responder
Vinícius Thiengo (0) (0)
04/03/2015
Vlw Junior, essa do não chamar o LastLocation faz sentido.
Responder
04/03/2015
Então Junior, obrigado pela resposta vou verificar isso e fazer novo teste.
Responder
22/01/2016
Junior, não entendei seu comentário. Creio que isso devera ser a solução do meu problema. Peço sua ajudar.
Responder