Olá, neste post irei demonstrar como a sua aplicação Xamarin.Forms pode pegar a localização (Latitude x Longitude) do dispositivo utilizando o GPS.
Para este exemplo irei assumir que você acabou de criar uma aplicação Xamarin.Forms, caso possua alguma dúvida sobre isso recomendo ler o post Criando um projeto Xamarin.Forms.
O primeiro passo após a sua aplicação ter sido criada é adicionar o Nuget Package Xam.Plugin.Geolocator.
Adicionando o NuGet Package
Clique com o botão direito em cima de sua Solution e selecione “Manage NuGet Packages for Solution…”.
Digite “Xam.Plugin.GeoLocator” e selecione o plugin como demonstrado na imagem a seguir.
Selecione todos os projetos e clique no botão “Install”.
Após a instalação do plugin, o próximo passo é colocar os elementos visuais para demonstrar a localização do dispositivo. E também colocar um botão para pegar/atualizar a localização. É possível observar no exemplo a seguir o código do xaml possuindo algumas labels e um botão.
XAML
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="utf-8" ?> | |
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" | |
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" | |
xmlns:local="clr-namespace:DemoGPS" | |
x:Class="DemoGPS.MainPageDemoGPS"> | |
<StackLayout Margin="0,25,0,0"> | |
<Button Text="Localização" Clicked="GetPosition" BackgroundColor="#EEE" /> | |
<Label Text="Latitude" FontSize="20" HorizontalOptions="CenterAndExpand" /> | |
<Label x:Name="LatitudeLabel" FontSize="30" HorizontalOptions="CenterAndExpand" /> | |
<Label Text="Longitude" FontSize="20" HorizontalOptions="CenterAndExpand" /> | |
<Label x:Name="LongitudeLabel" FontSize="30" HorizontalOptions="CenterAndExpand" /> | |
</StackLayout> | |
</ContentPage> |
O evento click do botão irá chamar o método “GetPosition” que irá de fato pegar a localização do dispositivo. Esse método foi criado no Code-Behind para fins de demonstração.
Code-Behind
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using Plugin.Geolocator; | |
using System; | |
using Xamarin.Forms; | |
namespace DemoGPS | |
{ | |
public partial class MainPageDemoGPS : ContentPage | |
{ | |
public MainPageDemoGPS() | |
{ | |
InitializeComponent(); | |
} | |
private async void GetPosition(object sender, EventArgs e) | |
{ | |
var locator = CrossGeolocator.Current; | |
locator.DesiredAccuracy = 50; | |
var position = await locator.GetPositionAsync(TimeSpan.FromSeconds(10)); | |
LongitudeLabel.Text = string.Format("{0:0.0000000}", position.Longitude); | |
LatitudeLabel.Text = string.Format("{0:0.0000000}", position.Latitude); | |
} | |
} | |
} |
Permissões
Para o seu App poder acessar o GPS do dispositivo, é necessário configurar as permissões de acordo com cada plataforma.
Android
Para configurar as permissões de sua aplicação android, é necessário alterar o Android Manifest selecionando as seguintes permissões: ” ACCESS_COARSE_LOCATION” e “ACCESS_FINE_LOCATION”, como demonstrado a seguir.
Clique com o botão direito no projeto android e selecione “Properties”.
Clique em “Android Manifest”.
Selecione “ACCESS_COARSE_LOCATION” e “ACCESS_FINE_LOCATION”.
iOS
Para configurar as permissões de sua aplicação iOS, é necessário editar o arquivo Info.plist do seu projeto iOS.
Clique com o botão direito em cima do arquivo Info.plist.
Adicione o seguinte trecho de código no final do arquivo, dentro de “dict” como demonstrado a seguir.
Info.plist
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
… | |
<key>NSLocationUsageDescription</key> | |
<string>Esse aplicativo precisa acessar a sua localização.</string> | |
<key>NSLocationAlwaysUsageDescription</key> | |
<string>Esse aplicativo precisa acessar a sua localização.</string> | |
<key>NSLocationWhenInUseUsageDescription</key> | |
<string>Esse aplicativo precisa acessar a sua localização.</string> | |
</dict> | |
</plist> |
Resultado
Android
iOS
Esse e todos os exemplos deste blog encontram-se disponíveis no GitHub.
Olá Juliano, primeiramente parabéns pelo post… sucinto e direto ao ponto. Seria possível iimplementar algo com o Task.wait, para pegar as coordenadas num espaço de tempo e salvando no banco… Como faria para rodar em background?
CurtirCurtir
Olá Jean,
Obrigado, a ideia é exatamente essa, post sucinto e direto.
Bom.. é possível, só tome um pouco de cuidado com a frequência dessa sua Task para que não consuma muitos recursos do dispositivo.
Segue um link te auxiliando como rodar em background. ( https://xamarinhelp.com/xamarin-background-tasks/ )
Basicamente você ira criar uma Task para ser executada em um determinado período como demonstrado no link a acima. E chamará o método GetPosition, só que ao invés de atualizar o valor da label você irá persistir os dados no banco.
Espero ter ajudado.
CurtirCurtido por 1 pessoa
Olá Juliano,
Indo direto ao ponto…
É possível construir um App de GPS em Xamarin do tipo Waze, utilizando os mapas do google? pois gostaria de navegar em cima de uma mapa do google estilizado através de camadas KML…
Por favor, me dê o caminho das pedras…
abs
CurtirCurtir
Olá Gleyson,
Sim… é possível criar utilizando os mapas do google. Porém, o mapa é do google, então não sei até que nível de customização você vai conseguir obter.
Pensando mais no lado funcional da coisa, recomendo esses dois links:
Ver no Medium.com
http://blog.xamarians.com/Blog/2017/6/29/highlighting-route-on-map-
Espero que te ajude.
Abraços.
CurtirCurtir
Opa Juliano,
Usei esse exemplo, só estou tendo problemas quando não tenho internet, mesmo com a localização ativada, ele pega a ultima localização isso se mantenho o app aberto após o uso dele com internet, agora se estou sem conexão e abro o app aí da um erro de task encerrada.
Não sei se ele precisa de conexão ou pode ser porque meu tablet que uso para testar apps não tem gps nem rede de operadoras para ligação, ou se você pode me indicar algo para uso offline
Valeu abraço
CurtirCurtir
Olá Luciano,
Recomendo você realizar os testes utilizando um device físico. Provavelmente esse erro está ocorrendo porque não foi tratado a falta de rede.
Espero ter ajudado. Abraço
CurtirCurtir
O Luciano deu um exemplo de um problema que esta acontecendo comigo também, estou utilizando a lib jamesmontemagno/GeolocatorPlugin e testando em dispositivo real. Porem quando eu desligo o Wifi e o sinal do acesso ao chip e os dados Moveis a lib não consegue retornar nenhuma posição. Teria algo a se fazer quando isso acontece ou algum passo que eu não fiz?
CurtirCurtir
Olá Jefferson,
Sim, o que voce pode estar fazendo é antes de chamar o método para retornar a posição, realize uma validação para se certificar que o dispositivo tem conexão com a internet.
Se precisar, tem este poste aqui que pode te ajudar nisso.
https://julianocustodio.com/check-internet/
CurtirCurtir