Xamarin Forms - Abrindo uma Localização usando Maps


 Neste artigo vou mostrar como abrir uma localização específica em um mapa usando os recursos da biblioteca Xamarin Essentials.

A classe Maps da biblioteca Xamarin.Essentials permite que um aplicativo abra o aplicativo de mapas instalado em um local ou marcador específico.

A funcionalidade Map funciona chamando o método OpenAsync com Location ou Placemark para abrir com MapLaunchOptions opcional.

No exemplo eu vou criar apenas o projeto para Android pois não tenho um ambiente para Mac. Assim vale alertar que Android usa o esquema de Uri geo: para iniciar o aplicativo de mapas no dispositivo.

Isso pode levar o usuário a optar por um aplicativo existente que suporte esse esquema de Uri. O Xamarin.Essentials é testado com o Google Maps, que é compatível com este esquema.

Se você não conhesse essa biblioteca leia o meu artigo:  Introdução ao Xamarin Essentials

A Xamarin.Essentials é uma nova biblioteca oficial da Microsoft que fornece aos desenvolvedores mais de 30 APIs de plataforma cruzada para que seus aplicativos móveis acessem os recursos nativos. Isso pode parecer similar aos Plugins for Xamarin, mas é uma evolução que é super otimizada para cada plataforma, fornece uma API consistente e é bem documentada sendo também open source no GitHub.

Motivos para usar:

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_LocalMapa:

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.  (Eu estou criando apenas o projeto Android mas fique a vontade para criar os demais projetos)

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 :

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);
}

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_LocaMapa"
             x:Class="XF_LocaMapa.MainPage">
    <StackLayout>
        <Label FontAttributes="Bold" Text=" Abrir um local específico usando o Maps" VerticalOptions="Center" 
HorizontalOptions="Center" />
        <Entry x:Name="entryLongitude" Placeholder="Longitude. Ex: -46,6521" />
        <Entry x:Name="entryLatitude" Placeholder="Latitude. Ex: -23,5652" />
        <Entry x:Name="entryNome" Placeholder="Nome da localização" />
        <Button x:Name="btnclick" Text="Obter localização" Clicked="btn_clicked" />
    </StackLayout>
</ContentPage>

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

using System;
using Xamarin.Essentials;
using Xamarin.Forms;
namespace XF_LocaMapa
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
        }
        public async void btn_clicked(object sender, System.EventArgs e)
        {
            try
            {
                var location = new Location(Convert.ToDouble(entryLatitude.Text), 
Convert.ToDouble(entryLongitude.Text));
                var options = new MapLaunchOptions
                {
                    Name = entryNome.Text
                };
                await Map.OpenAsync(location, options);
            }
            catch(Exception ex)
            {
                // Não foi possivel acessar o mapa
                await DisplayAlert("Erro : ", ex.Message, "Ok");
            }
        }
    }
}

Executando o projeto e informando a latitude e longitude e o nome do local ao clicar no botão de comando iremos obter o seguinte resultado:

"Há um só corpo e um só Espírito, como também fostes chamados em uma só esperança da vossa vocação;
Um só Senhor, uma só fé, um só batismo;
Um só Deus e Pai de todos, o qual é sobre todos, e por todos e em todos vós."
Efésios 4:4-6

Referências:


José Carlos Macoratti