Xamarin Forms - Geolocalização usando Xamarin Essentials


 Neste artigo vou mostrar como podemos obter a geolocalização com base nas informações do dispositivo usando a biblioteca Xamarin Essentials.

A geolocalização é um processo pelo qual se estabelece o local de onde o usuário está efetuando determinada operação, como por exemplo: atender uma chamada de celular , acessar um site , tirar uma fotografia , utilizar o GPS, entre outros. 

A geolocalização tira proveito dos serviços de localização específicos do dispositivo para ajudar a fornecer um local para um determinado usuário em qualquer momento.

Hoje veremos como obter a geolocalização usando a biblioteca Xamarin Essentials. Se você não conhesse essa biblioteca leia o meu artigo:  Introdução ao Xamarin Essentials

Vamos lá...

Recursos usados:

Criando o projeto e instalando as dependências

Abra o  VS 2017 Community e clique em New Project e a seguir escolha Cross Platform -> Mobile App (Xamarin.Forms) e informe o nome XF_Geolocaliza1:

A seguir selecione a Plataforma, eu marquei somente Android, e escolha a estratégia de compartilhamento que será .NET Standard.

Clique no botão OK.

Pronto nosso projeto já esta criado. ( Atualmente(11/2018) a versão mais atual estável é a 3.4.0.1)

No menu Tools, clique em Nuget Package Manager e a seguir em Manage Nuget Packages for Solution;

Digite : Xamarin.Essentials para localizar o pacote e a seguir marque o pacote e instale-o em todos os projetos:

Pronto ! agora já temos todos os recursos necessários nos projetos falta fazer alguns ajustes no projeto Android.

Ajustes a serem feitos na plataforma Android

No momento em que esse artigo foi escrito os ajustes necessários na plataforma Android eram os seguintes :

Nota: Orientação obtida em: https://docs.microsoft.com/pt-br/xamarin/essentials/geolocation?tabs=android

No arquivo MainActivity.cs inclua a seguinte instrução:

 Xamarin.Essentials.Platform.Init(this, savedInstanceState);

A seguir inclua também o método abaixo:

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
    Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
    base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}

Para permitir que um aplicativo Android acesse os serviços de localização, precisamos ativar duas permissões do Android:

1 - ACCESS_COARSE_LOCATION
2 - ACCESS_FINE_LOCATION


Uma forma de fazer isso é abrir a janela de propriedades para o projeto Android e a seguir clicar em Android Manifest e marcar as opções conforme mostra a figura a seguir:

Outra forma é abrir o arquivo AssemblyInfo na pasta Properties do projeto Android e incluir o código abaixo:

// Add some common permissions, these can be removed if not needed
[assembly: UsesPermission(Android.Manifest.Permission.Internet)]
[assembly: UsesPermission(Android.Manifest.Permission.WriteExternalStorage)]
[assembly: UsesPermission(Android.Manifest.Permission.AccessCoarseLocation)]
[assembly: UsesPermission(Android.Manifest.Permission.AccessFineLocation)]
[assembly: UsesFeature("android.hardware.location", Required = false)]
[assembly: UsesFeature("android.hardware.location.gps", Required = false)]
[assembly: UsesFeature("android.hardware.location.network", Required = false)]

Ajustes no Android e no Genymotion

No nosso exemplo eu vou fazer a emulação do projeto Android usando o Genymotion. Dessa forma, como eu não vou usar um dispositivo físico, vou definir os dados iniciais do GPS do GenyMotion, informando uma latitude, longitude e altitude conforme mostra a figura abaixo:

Se você for usar outro emulador procure a opção de configuração para o GPS e defina os dados iniciais. Se for usar um dispositivo físico isso não é necessário.

Definindo o código da MainPage

Agora abra o arquivo MainPage.xaml e inclua as seguintes views usando um layout StackLayout:

<?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:XF_Geolocaliza1"
             x:Class="XF_Geolocaliza1.MainPage">
    <StackLayout>
        <Label FontAttributes="Bold" Text="Retorna a Geolocalização Atual" VerticalOptions="Center" 
HorizontalOptions="Center"/>
        <Label FontAttributes="Bold" x:Name="lblLongitude" Text="Longitude :" VerticalOptions="Center" 
HorizontalOptions="Center"/>
        <Label FontAttributes="Bold" x:Name="lblLatitude" Text="Latitude :" VerticalOptions="Center"
 HorizontalOptions="Center"/>
        <Label FontAttributes="Bold" x:Name="lblAltitude" Text="Altitude :" VerticalOptions="Center"
 HorizontalOptions="Center"/>
        <Button x:Name="btnclick" Text="Retornar Coordenadas" Clicked="btn_clicked"/>
    </StackLayout>
</ContentPage>

Agora abra o arquivo MainPage.xaml.cs e defina o código para o evento de do botão de comando:

using System;
using Xamarin.Essentials;
using Xamarin.Forms;
namespace XF_Geolocaliza1
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
        }
        public async void btn_clicked(object sender, System.EventArgs e)
        {
            try
            {
                var localizacao = await Geolocation.GetLastKnownLocationAsync();
                if (localizacao != null)
                {
                    lblLatitude.Text += localizacao.Latitude.ToString();
                    lblLongitude.Text += localizacao.Longitude.ToString();
                    lblAltitude.Text += localizacao.Altitude.ToString();
                }
            }
            catch (FeatureNotSupportedException fnsEx)
            {
                // Recurso não suportado no device
                await DisplayAlert("Erro ", fnsEx.Message, "Ok");
            }
            catch (PermissionException pEx)
            {
                // Tratando erro de permissão
                await DisplayAlert("Erro: ", pEx.Message, "Ok");
            }
            catch (Exception ex)
            {
                // Não foi possivel obter localização
                await DisplayAlert("Erro : ", ex.Message, "Ok");
            }
        }
    }
}

O método GetLastKnownLocationAsync obtém o último local  conhecido do dispositivo que mais rápido que fazer uma consulta completa mas é menos preciso.

Executando o projeto e clicando no botão para obter a geolocalização iremos obter os valores conforme mostra a primeira figura.

Pegue o código das páginas aqui :  XF_Geolocaliza1.zip (sem as referências)

(disse Jesus) - 'Porque o coração deste povo está endurecido,E ouviram de mau grado com seus ouvidos,E fecharam seus olhos;Para que não vejam com os olhos,E ouçam com os ouvidos,e compreendam com o coração,e se convertam,e eu os cure.'
Mateus 13:15

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti