navegação

Se você já precisou desenvolver um aplicativo usando geolocalização, talvez já precisou capturar a movimentação do dispositivo para exibir uma atualização de localização para seu usuário, ou já pensou em como isto seria um incremento bacana para seu app.

Capturar as mudanças localização do smartphone é simples com o plugin Geolocator desenvolvido pelo James Montemagno.

O plugin é open source e está disponível no GitHub neste endereço

Instalando o plugin

O plugin está disponível para ser instalado pelo NuGet com o nome Xam.Plugin.Geolocator

Instale o plugin em no projeto PCL/.Net Standart e em todas as plataformas

Nuget

Configurando o projeto para capturar a geolocalização

Vamos precisar habilitar algumas permissões no projetos para que o app tenha acesso a geolocalização do aparelho:

Android

Acesse as propriedades do projeto Android, selecione a aba Android Manifest. Vamos selecionar as permissões ACCESS_FINE_LOCATION  e ACCESS_COARSE_LOCATION

Em MainsActivity.cs vamos adicionar o código abaixo:

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults)
{
     PermissionsImplementation
           .Current
           .OnRequestPermissionsResult(requestCode, permissions, grantResults);
}

E vamos adicionar as bibliotecas:

using Plugin.Permissions; 
using Plugin.Permissions.Abstractions; 

iOS

No projeto iOS vamos adicionar as linhas abaixo no arquivo info.plist

<key>NSLocationWhenInUseUsageDescription</key>
<string>Localizacao App</string>

Listener de mudança de localização

Após importar o plugin na MainActivity, já podemos criar o método que irá ficar escutando a mudança de localização do aparelho

Todo o processo irá acontecer através do objeto CrossGeolocator.Current .  Este objeto contém o método StartListeningAsync() que recebe como parametro o tempo em que ele deve chamar o evento responsável pela mudança de localizado e os metros para mudança de localização.

Importante ressaltar que apenas um listener pode ser executado dentro de Current e possui escopo global, então, se iniciarmos um listener na tela 1, para iniciarmos novamente o listerner na tela 2 com funções diferentes, precisamos primeiro parar o listener para inicar um listener que faça ações diferente.

Adicionando o Listener a uma página

Você pode utilizar o padrão MVVM para executar o seu listener de localização. Neste exemplo, para não estender o post, irei adicionar o listener no code behind da página MainPage.xaml

public partial class MainPage : ContentPage
{
	public MainPage()
	{
		InitializeComponent();
		StartListening();
	}

	async void StartListening()
	{
		if (CrossGeolocator.Current.IsListening)
			await CrossGeolocator.Current.StopListeningAsync();

		await CrossGeolocator
			.Current
			.StartListeningAsync(TimeSpan.FromSeconds(120), 10);

		CrossGeolocator.Current.PositionChanged += PositionChanged;
		CrossGeolocator.Current.PositionError += PositionError;
	}

	private void PositionChanged(object sender, PositionEventArgs e)
	{
		var position = e.Position;
		Console.WriteLine("Latitude: " + position.Latitude + 
				  " Longitude: " + position.Longitude);
	}

	private void PositionError(object sender, PositionErrorEventArgs e)
	{
		Console.WriteLine("error");
	}
}

No código acima estou verificando se existe um listener de localização em execução, se existir pauso para poder iniciar um novo.

Informei 2 minutos para execução do evento de mudança de localização e 10 metros de alteração.

Em CrossGeolocator.Current.PositionChanged += PositionChanged; e CrossGeolocator.Current.PositionError += PositionError; foi instanciado um delegate para tratar os eventos de mudança de localização que será chamados automaticamente pelo plugin a cada 2 minutos e quando a mudança for superior a 10 metros.

Quando o evento é chamado o plugin informa o objeto PositionEventArgs que conterá informações referente a movimentação como Latitude e Longitude que são printados no Console de saída na linha Console.WriteLine(“Latitude: ” + position.Latitude + ” Longitude: ” + position.Longitude);

Conclusão

O plugin facilita muito o tratamento de eventos de mudança de localização, o que ajuda muito para fazer o tracking de movimentação do smartphone que está excutando o app. Com a Latitude e Longitude, podemos consumir um serviço para identificar o endereço ou até mesmo atualizar um pin no mapa, verificar opções próximas ao smartphone, entre outros.

Curtiu? Teve problema? Comenta aqui!

Você pode baixar o código fonte do post no meu GitHub

#Ubuntu

Imagem utilizada no post Pixabay

(Cross-post de http://rsamorim.azurewebsites.net/2018/03/01/xamarin-forms-capturando-mudanca-de-localizacao/)

Robson Soares Amorim