Você está na página 1de 13

Sensor de Localização de Dispositivos Móveis com Delphi XE5

outubro 6, 2013 Landerson Gomes 37 Comentários

Nesta postagem acessaremos o Sensor de Localização de dispositivos móveis através de


uma aplicação desenvolvida com Delphi XE5.
Neste tutorial daremos prosseguimento a nossa série de desenvolvimento de aplicações de exemplos utilizando Delphi XE5 para acessar
funcionalidades de dispositivos móveis com poucas linhas de código. Nele faremos acesso ao sensor de localização do dispositivo fazendo
com que a sua localização seja plotada no mapas através de integração com o Google Maps.

Iniciando o Delphi e preparando a aplicação

Iniciaremos o Delphi XE5 e criaremos um Novo Projeto Móvel através do menu File–> New Project –> Delphi Projects –> Mobile
Projects. Adotaremos o modelo de aplicação em branco (Blank Application).

Feito isso salvaremos nosso projeto através do menu File –> Save All. Chamaremos a Unit de frmLocalizacaoUnt e o projeto chamaremos
de prjLocalizeMe.

Agora vamos inserir em nossa aplicação os componentes que farão com que ela fique funcional. Vamos adicionar 2 Label‟s, 1 WebBrowser,
1 ToolBar, 1 Switch e um LocationSensor. Então teremos

ToolBar1
o Align –> alTop

Label1
o Text –> Localização

Label2
o Align –> alBotton
o Text –> www.landersongomes.vivaitaocara.com.br

WebBrowser1
o Align –> alClient

LocationSensor1
o Distance –> 50

Ao final do processo acima nossa tela de design ficará semelhante à figura abaixo.
Ativando e desativando o sensor

O objeto Switch1, não alteramos nenhuma de suas propriedades… mas será ele o nosso “interruptor” para ligar e desligar o Sensor de
Localização LocationSensor1. Para o Switch1 vamos codificar seu evento OnSwitch, que seria o seu ativar/desativar propriamente dito, esse
é o código:

1
procedure TForm1.Switch1Switch(Sender: TObject);
2
begin
3LocationSensor1.Active := Switch1.IsChecked;

4if LocationSensor1.Active = False then

5 begin

6 Label2.Text := 'landersongomes.vivaitaocara.com.br';

WebBrowser1.Navigate(Label2.Text);
7
end;
8
end;
9

Note que atribuímos ao Sensor de Localização (LocationSensor1) atividade ou não de acordo com a ativação ou não do Switch, assim sendo,
ativado o Switch ativamos consequentemente o Sensor. Em seguida, apenas por estética, verificamos se o sensor está inativo, caso esteja,
passamos o endereço do meu blog para a propriedade Text do Label2 e em seguida, passamos ela como URL para o WebBrowser1 Navegar.
Então se o sensor estiver desativado, o WebBrowser1 abrirá meu blog.

Ajuda do GoogleMaps

Já configuramos o comportamento da aplicação quando o sensor estiver desligado, agora vamos configurá-la para o funcionamento com o
sensor ligado dando-lhe a funcionalidade de exibir nossa posição no Mapa.

Antes de mais nada precisamos pegar uma linha com o GoogleMaps, será a linha que passaremos para nossa aplicação conseguir “desenhar”
o mapa, e nossa aplicação por sua vez passará para o GoogleMaps a localização do ponto que queremos desenhar. É bem simples, veja a
linha:

https://maps.google.com/?q=%s,%s&&t=h&&z=13&&hl=pt-BR&&output=embed

Basicamente, chamamos o GoogleMaps, informamos a ele a parte do mapa que queremos, representada na linha por: “?q=%s,%s”, cada um
dos “%s” será trocado por sua respectiva coordenada a ser fornecida pelo sensor quando ativado. O restante são variáveis capazes de mudar o
comportamento do mapa:
&t=h –> indica o tipo do mapa, nesse caso híbrido.

&z=13 –> indica que nosso mapa será exibido com 13 de zoom.

&output=embed –> quer dizer que nosso mapa estará embarcado no navegador, sem exibir recursos específicos de tela do GoogleMaps.

Atualizar a Localização e Exibir o Mapa

Para exibirmos a localização, trataremos o evento OnLocationChanged, que é acionado sempre que sensor se movimenta superando o limite
estabelecido em sua propriedade Distance, que em nosso caso setamos para 50 metros. Passaremos nesse evento a linha do Google citada na
sessão anterior e receberemos as coordenadas por parte do LocationSensor1, veja como ficará o código a ser chamado no evento:

procedure TForm1.LocationSensor1LocationChanged(Sender: TObject; const OldLocation, NewLocation:


1TLocationCoord2D);

3const

4 Navegar : string = 'https://maps.google.com/?q=%s,%s&&t=h&&z=13&&hl=pt-BR&&output=embed';

5
begin
6
Label2.Text := Format(navegar, [ Format('%2.6f', [NewLocation.Latitude]), Format('%2.6f',
7[NewLocation.Longitude])]);

8 WebBrowser1.Navigate(Format(navegar, [Format('%2.6f', [NewLocation.Latitude]), Format('%2.6f',


[NewLocation.Longitude])]));
9
end;

Com isso já temos o necessário para rodar a aplicação. Apenas explicando o conteúdo do código adicionado:

Declaramos a constante Navegar do tipo string e atribuímos a ela a linha que pegamos “emprestada” do GoogleMaps. Em seguida usamos a
função Format encadeadamente, uma vez passando valores do tipo Float, Latitude e Longitude do NewLocation passado no Evento sempre
que a localização mudar. Utilizamos aí o formato de 2 casas inteiras e 6 casas decimais expressas pela string „%2.6f‟, assim forçamos as
coordenadas a serem exibidas sob essa formatação.

Exibimos esse resultado na propriedade Text do Label2, este conteúdo é a url a qual o Webbrowser1 logo em seguida recebe como parâmetro
informando o destino da sua navegação.

Executando a aplicação percebemos que a mesma já funciona, entretanto pode ocorrer de o mapa não estar representando sua real
localização.

O ponto chave da localização


Certamente, se você está no Brasil, perceberá que o separado de decimais e inteiros adotados no aqui é a vírgula(“,”), porém quando
passamos as coordenadas com vírgula o GoogleMaps não consegue entender, uma vez que seus servidores estão em solo norte-americanos e
lá o separador decimal é o ponto (“.”).

Para resolvermos esse impasse basta setarmos o separador decimal dentro de nossa aplicação para ponto “.”, sendo assim vamos inserir
imediatamente após o “begin” da codificação do evento OnLocationChanged essa linha FormatSettings.DecimalSeparator := ‘.’; .

Com isso devemos salvar nossa aplicação e executá-la novamente para conferir o resultado.

A chave para que a aplicação realmente funcione no Brasil é termos o Separador de decimal alterado… simples assim, fazendo isso o
exemplo postado pela Embarcadero em vídeo, ou o exemplo que acompanha o Delphi XE5 disponibilizado em sua “Welcome Page”
funcionarão perfeitamente.

Relacionado

Delphi XE5 Enviando SMS direto de sua aplicação Android

Em "Delphi"

Delphi XE5 Acessando a Câmera e compartilhando imagens do dispositivo Android

Em "Delphi"
Delphi XE5 Efetuando chamadas telefônicas direto de sua aplicação móvel

Em "Delphi"

AndroiddelphiDelphi XE5desenvolvimentoGoogle MapsGPSiOSLocation SensorSensor de LocalizaçãoTutorial

Navegação do post
Post anteriorDelphi XE5 Acessando a Câmera e compartilhando imagens do dispositivo AndroidPróximo postITCast – A Tecnologia de Ponta no Noroeste
Fluminense

37 opiniões sobre “Sensor de Localização de Dispositivos Móveis com Delphi XE5”


1. Pingback: ITCast – A Tecnologia de Ponta no Noroeste Fluminense

2. Brunno

outubro 29, 2013 às 10:38

Gostaria de saber se e possivel tracar rotas com esses componentes

Responder

1. Landerson Gomes dos Santos

outubro 29, 2013 às 11:08

Bruno boa tarde. Na verdade nesse exemplo não usamos componente mas sim a url do googlemaps, para traçar rota, faça o
procedimento no navegador e depois copie essa url para o exemplo, trocando os fatores variáveis “origem” e “destino”. Vai
funcionar!

Responder

3. Brunno

outubro 29, 2013 às 15:23

Teria como mostrar um pequeno exemplo para eu entender melhor?

Responder
1. landerson

outubro 30, 2013 às 10:31

Bem Bruno… não sei se você tentou fazer algo… mas basicamente seria o seguinte: abrir o browser e acessar o Google
Maps… fazer sua pesquisa de rota, daí você clica para exibir o link da pesquisa de rotas, no meu caso ficou assim:
https://maps.google.com/?saddr=Pimenta-MG&&daddr=Itaocara-RJ&&t=h&&z=13&&hl=pt-BR

note que temos as variáveis saddr e daddr com valores de “Pimenta Minas Gerais” e “Itaocara” respectivamente esses valores
serão substituídos por strings a serem passadas por seu aplicativo.

Tente fazer isso!

Responder

1. Francisco

agosto 2, 2014 às 13:14

Olá, não estou conseguindo visualizar o exemplo que fez para o Bruno, mostrando como traçar rotas. Preciso fazer um
app que receba um determinado endereço e exiba no mapa e também traçe rotas entre dois endereços.
Pode me ajudar? Obrigado

Responder

1. Landerson Gomes

agosto 3, 2014 às 08:36

Olá Francisco, o para traçar rotas, vá até o maps normal pelo computador, trace uma de exemplo. Daí você
pega o conteúdo da barra de endereços no seu navegador e adapta transformando seus pontos destino e partida
em variáveis. Esse é o conceito, veja se resolve!
Se não sinalize aqui.

Abraço.

Responder

4. Brunno

outubro 30, 2013 às 12:38

Ok Obrigado, ajudou muito

Responder

5. Ramon

março 13, 2014 às 22:41


Olá landerson.
Parabéns pelo exemplo. A questão é que fiz um teste aqui e o meu mapa fica atualizando constantemente, impossibilitando a
visualização do local referenciado. Mudei as propriedades do componente Location, mas não consegui estabilizar. Sabe o que pode
ser ?
Obrigado.

Responder

6. Leonardo

março 21, 2014 às 21:26

Boa noite camarada, gostaria de saber o seguinte, teria como implementar para um lugar em especifico, e esse lugar tendo varios
andares, estou pretendendo criar um GPS para supermercados, faculdades etc. Sabe me dizer como posso tratar essas questoes de
andares? O Delphi tem esse requisito?
Desde ja agradeço, fique na paz!

Responder

1. Landerson Gomes

março 25, 2014 às 20:37

Olá Leonardo… coisa linda essa que você quer hein?! Já vi em cinema rsrs. Brincadeiras a parte acredito que seja possível
sim uma vez que os dispositivos conseguem informar altitude e elevação de terreno… mas te sendo bem sincero nem imagino
como proceder. Muita pesquisa aí no seu caminho… é o que vejo para você.

Um abraço.

Responder

7. Vinicius

março 24, 2014 às 21:14

Teste seu app agora, veja se ele mostra o mapa..

Obrigado.

Responder

1. Landerson Gomes

março 25, 2014 às 20:34

Olá Vinicius boa noite… na verdade a função “embed” passa a não ser suportada mas pelos frames no Google Maps, de
acordo com a API que estávamos usando.
Se você retirar a parte do Embeded… vai abrir, ou seja, sua string Navegar seria:

https://maps.google.com/?q=%s,%s&&t=h&&z=13&&hl=pt-BR
Estudando a API do Google Maps você encontrará outras maneiras de solucionar o problema.

Um abraço.

Responder

8. Fabio Gomes Rezende

abril 7, 2014 às 11:30

Bom dia Landerson, tentei trabalhar com este sensor e tem hora que funciona e tem hora que não, na verdade eu precisava somente
que me retornasse o nome da cidade onde estou, sabe como fazer isto?

Responder

1. Landerson Gomes

abril 13, 2014 às 19:23

Boa tarde Fabio. O sensor depende muito do aparelho para fixar a real posição do mesmo.
Sinceramente a sua questão só conseguiria resolver com uma profunda pesquisa… talvez você consiga algo dando uma
pesquisada na api do Google Maps.
Lembro-me de ter visto situação semelhante a descrita por você a muito tempo atrás num exemplo do Marco Cantù
(http://blog.marcocantu.com/blog/google_map_delphi_server.html), como falei faz muito tempo… mas quem sabe consiga
evoluir a partir daí.

Abraço.

Responder

9. Riba

abril 17, 2014 às 10:20

Olá! Obrigado pelas dicas! Para usar a API do GoogleMaps terei de pagar pela API.?

Responder

1. Landerson Gomes

abril 17, 2014 às 20:55

Olá Riba.
o Acesso à API é gratuito, esse link pode ser o seu caminho: https://developers.google.com/maps/?hl=pt-br. Boa sorte e bons
códigos aí.

Responder

1. Marcio
agosto 21, 2014 às 11:58

Estou tentando consumir a API da Matriz de distâncias do Google. A minha dúvida é a seguinte: Depois que eu recebo
a resposta no formato JSON, como eu faço pra exibir essas informações em um TWebBrowser, ou seja, montar uma
URL válida.
http://maps.googleapis.com/maps/api/distancematrix/json?origins=Vancouver+BC|Seattle&destinations=San+Francisc
o|Victoria+BC&mode=bicycling&language=fr-FR&sensor=false

Responder

1. Landerson Gomes

agosto 22, 2014 às 13:08

Marcio bem vindo e obrigado pela participação!


O resultado que você está obtendo sendo JSON, tem seu “valor” já expresso em string, logo você deve ler o
JSON e pegar o JSON.VALUE passando ele para sua url prefixada nas posições desejadas.
Faça uso da função: Format() deve resolver tudo por aí!
Abraço e mais uma vez obrigado pela participação!

Responder

10. Fabio Gomes Rezende

abril 22, 2014 às 11:11

Olá, estou com um problema muito grave no android, porém, acredito que alguém poderá me ajudar. Já desenvolvi uma aplicação, e
meu problema é quando o celular desliga a tela automanticamente (tempo de duração da luz de fundo). Assim que a tela se apaga,
caso tenha um Showmessage, ou qualquer tela de mensagem aguardando clicar em OK, o sistema trava. O que pode ser isto? uso xe5
up2

Responder

11. Pingback: ITCast - A Tecnologia de Ponta no Noroeste Fluminense | Landerson Gomes

12. Juan Nunes

outubro 22, 2014 às 03:49

Como faco para perceber quando o sensor de GPS esta ativo ou nao???

Responder

1. Landerson Gomes

outubro 30, 2014 às 10:08

Olá Juan… seja bem vindo! Dê uma estudada no componente LocationSensor, ele tem a propriedade Started que retorna se
ele está em funcionamento. (Boolean)
(http://docwiki.embarcadero.com/Libraries/XE7/en/System.Sensors.TCustomLocationSensor.Started) Ele é ativado chamando
o método Start.
Vale a leitura para um melhor entendimento:
http://docwiki.embarcadero.com/Libraries/XE7/en/System.Sensors.Components.TLocationSensor

Apenas lembrando que o componente passou por um grande amadurecimento desde a postagem, na versão XE7 ele está com
muito mais recursos disponíveis.

Abração e boa sorte aí!

Responder

13. José Luis

dezembro 13, 2014 às 13:41

Boa Tarde
Gostaria de saber se é possivel ter um mapa offline no aparelho?

Responder

1. Landerson Gomes

dezembro 15, 2014 às 18:33

Olá José Luís, seja bem vindo! Olha possível acredito que seja sim, porém não tenho a mínima idéia de como seria
implementar tal funcionalidade.
Lembrando que o OI MAPAS é assim, então por isso acredito que seja possível.
Lamento não poder ser mais eficiente que isso, mas realmente passa bem longe qualquer idéia de como fazê-lo.

De qualquer forma reitero as boas vindas e muito obrigado por sua participação.

Responder

14. Wellington

maio 23, 2015 às 15:23

Boa Tarde,
como eu faria pra pegar a distancia entre o local atual e o destino?
Também não consegui traçar rota.

Desde já, agradeço!

Responder

1. Landerson Gomes

junho 27, 2015 às 15:41

Olá Wellington bem vindo!


Note que nos comentários acima, há uma linha exemplificando em resposta ao Bruno… de uma conferida!
Espero que ajude!

Responder

15. Jefferson

setembro 18, 2015 às 03:25

Ola, estou usando o Xe7, compilei aplicação porém a mesma não utiliza o GPS, mesmo ele estando ativo, ela nao usa os recursos.
Sera que tem que usar o tal intent pra interagir

Responder

1. Landerson Gomes

setembro 29, 2015 às 12:44

Jefferson olá… Sugiro uma revisão, tente inclusive uma atualização via esse código do link, pois já tivemos 4 versões desde o
exemplo:
http://docwiki.embarcadero.com/CodeExamples/Seattle/en/FMX.LocationDemo_Sample.

Espero tê-lo ajudado, até a próxima!

Responder

16. Jefferson

setembro 30, 2015 às 00:31

Landerson, primeiraramente obrigado pela atenção, com o conteúdo do seu blog estou praticamente terminando meu app
(comercial)..Landerson, sobre a string do google, você tem um exemplo de como decodificar ela “quebrar” em rua, numero, bairro,
cep ? a partir da localização gostaria destes dados.

Agradeço desde já atenção.

Responder

1. Landerson Gomes

outubro 18, 2015 às 20:07

Olá Jefferson… Eu nunca cheguei a fazer nada nesse sentido, tentarei retomar com novos exemplos a partir de novembro,
tentarei abordar essa situação!
Até lá, ou até a próxima!

Responder

17. David

setembro 30, 2015 às 09:47


Olá, bom dia.. existe alguma forma de obter a velocidade atual de deslocamento com o uso do sensor de localização?
Grato pela atenção,

Responder

1. Landerson Gomes

outubro 18, 2015 às 20:09

Olá David obrigado por sua participação e seja bem vindo!


Até o presente momento não tentei fazer ainda, entretanto tenho em mente alguns novos exemplos a partir do próximo mês e
colocarei esse na lista de para novas postagens.

Até a próxima e mais uma vez obrigado!

Responder

18. Jose Renato

outubro 3, 2015 às 16:43

Olá, boa tarde!


Gostaria de saber se tem algum sensor para se obter a velocidade, mesmo sem usar o maps.
Valeu.

Responder

1. Landerson Gomes

outubro 18, 2015 às 19:52

Olá Jose Renato, nunca tentei nada nesse sentido pretendo dá uma analisada na questão após a Conference, chegando a
alguma solução posto aqui.
Mas o bom e velho Delta S/Delta T deve resolver.

Obrigado por sua participação e até a próxima!

Responder

19. marllone

janeiro 7, 2016 às 08:58

ola amigo gostei do seu projeto so que na hora d copilar da erro pois vc nao declarou

NewLocation.Latitude e nem NewLocation.Longitude. como faco para declarar ?

Responder

20. Andre
fevereiro 11, 2016 às 07:00

Olá Landerson, belo artigo !!


Verifiquei em um comentário acima que você não havia tido contato com trabalho com mapas offline. Continua sem ter ainda contato
? Você comentou sobre o OiMapas, ele é feito em Delphi ?
Obrigado.