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

Receba em primeira mão, e com prioridade, os conteúdos Android exclusivos do Blog. Você receberá um email de confirmação. Somente depois de confirma-lo é que poderei lhe enviar os conteúdos exclusivos.

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
(6133) (26) (1) (1)
Go-ahead
"Concentre todos seus pensamentos no trabalho que tem em mãos. Os raios solares não queimam até que sejam colocados em foco."
Alexander Graham Bell
Kotlin Android
Capa do livro Desenvolvedor Kotlin Android - Bibliotecas para o dia a dia
TítuloDesenvolvedor Kotlin Android - Bibliotecas para o dia a dia
CategoriasAndroid, Kotlin
AutorVinícius Thiengo
Edição
Capítulos19
Páginas1035
Acessar Livro
Treinamento Oficial
Android: Prototipagem Profissional de Aplicativos
CursoAndroid: Prototipagem Profissional de Aplicativos
CategoriaAndroid
InstrutorVinícius Thiengo
NívelTodos os níveis
Vídeo aulas186
PlataformaUdemy
Acessar Curso
Receitas Android
Capa do livro Receitas Para Desenvolvedores Android
TítuloReceitas Para Desenvolvedores Android
CategoriaDesenvolvimento Android
AutorVinícius Thiengo
Edição
Ano2017
Capítulos20
Páginas936
Acessar Livro
Código Limpo
Capa do livro Refatorando Para Programas Limpos
TítuloRefatorando Para Programas Limpos
CategoriaEngenharia de Software
AutorVinícius Thiengo
Edição
Ano2017
Capítulos46
Páginas599
Acessar Livro
Quer aprender a programar para Android? Acesse abaixo o curso gratuito no Blog.
Conteúdo Exclusivo
Receba em primeira mão, e com prioridade, os conteúdos Android exclusivos do Blog.
Email inválido

Opa, blz?

Nesse vídeo apresento uma maneira de como obter o endereço ou as coordenadas (quando for informado o endereço) da classe Geocoder do Location API no Android. Apesar da documentação ressaltar a utilização do FINE_LOCATION o Geocoder / Location API trabalha sem problemas com o FUSED_PROVIDER sem essa permissão (sem o uso do GPS), porém o resultado tende a ser desastroso (localidade obtida bem distante da real), logo recomendo que utilize o FINE_LOCATION e se for uma feature crítica as coordenadas do usuário em sua APP, solicite que ele ligue o GPS caso esteja desativado (há intent especifica somente para essa chamada ao usuário para ligar o GPS). A principio não há possibilidade de trabalhar com WayPoints ou com caminhos entre dois pontos (rotas), porém essa é uma funcionalidade que o Google Maps V2 nos permite realizar sem problemas.

Entenda que devido as chamadas do geocoder aos métods de captura de informação (getFromLocation, getFromLocationName, getFromLocationName) serem síncronos, há a necessidade de realizarmos estas dentro de uma worker thread, logo, indo pelo mesmo caminho que a documentação, optei por utilizar também um IntentService por já trabalhar fora da Thread principal quando dentro do método onHandleIntent() tendo em mente também que o script não foi criado para trabalhar com concorrência ou com aplicações externas acessando o Service. A principio é isso, vou dar continuidade a série colocando o Location API trabalhando em uma necessidade real ao invés de somente exemplos, sem mais delongas vou deixar você assistir ao vídeo.

Obs. : se possível tente a implementação com o ResultReceiver (presente da página de documentação da API) e depois tente com o EventBus lib, como no vídeo. Note a facilidade quando está utilizando o EventBus, sem aquele caminhão de código necessário do ResultReceiver. Outra implementação que você poderia testar é a dos métodos de resultado da classe Address, verifique quais realmente são retornados e quais são iguais a null.

O link para download do projeto se encontra logo abaixo no post.

Segue links dos primeiros vídeos da série:

Obtendo Localização Com Location API no Android - Parte 1

Location API no Android, Atualização de Localização - Parte 2

Segue links de vídeos que complementam o entendimento melhor das entidades utilizadas nesse vídeo como apoio a Location API / Geocoder:

EventBus Lib, Comunicação Entre Entidades Android

IntentService no Android, Entendendo e Utilizando

runOnUiThread, Atalho de Acesso a Thread Principal no Android

Segue links apresentados no vídeo:

Página de implmentação do Geocoder utilizando ResultReceiver, no site do Android

Página da classe final Geocoder no site do Android

Página da classe Address no site do Android

Vlw

Receba em primeira mão, e com prioridade, os conteúdos Android exclusivos do Blog.
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