Xamarin Forms -  Usando o Google Maps


  Neste artigo vou mostrar como configurar um projeto Xamarin Forms para usar os recursos do Google Maps.

Como houve mudanças na API do Google Maps e na forma de configurar o projeto Xamarin Forms veremos neste artigo como fazer para poder usar essa API.

Gerando a API KEY

A primeira coisa a fazer para usar o Google Maps em seu aplicativo Xamarin.Forms e obter uma chave de API ou API Key. 

Acesse o Console do desenvolvedor Google em Google Developers Console.

Se você não possuir uma conta se cadastre e crie uma conta pessoal.

Com a conta criada faça o login e acesse o Painel (Dashboard) e clique em Cadastro;

Na janela a seguir clique em Novo Projeto e a seguir informe um nome para o projeto;

Agora no Painel clique em : Ativar APIs e Serviços

- A seguir clique em Google Maps Android API (Eu vou criar apenas um projeto Android)

5- Depois clique no botão Ativar:

6- Agora clique no menu Credenciais e depois clique no botão Criar Credenciais e a seguir em Chave de API :

7- Sua Chave de API será gerada e exibida conforme a figura abaixo:

Anote a chave que mais adiante iremos usá-la em nosso projeto Xamarin Forms.

Nota: Você pode armazenar a chave no arquivo AndroidManifest.xml do seu projeto Android incluindo a chave na tag application :

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
...
<application android:allowBackup="true" android:label="@string/app_name">
        <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="SUA-API-KEY-AQUI" />
</application>
</manifest>

Esta chave gerada não contém nenhuma restrição e poderá ser usada por terceiros para consumir recursos da sua conta no Google. Se você deseja saber como restringir o acesso usando esta chave veja o meu artigo: Gerando e restringindo a chave para usar Mapas

Nota: Você não precisa restringir o acesso a sua chave se você for usar apenas localmente para teste.

Então vamos ao que interessa...

Recursos usados:

Criando o projeto no VS Community 2019

Abra o VS 2019 Community e clique em New Project;

Selecione a opção Mobile App(Xamarin.Forms) e clique em Next;

Informe o nome XF_GoogleMaps , selecione o local onde vai criar o projeto e clique no botão Create;

Na janela New Mobile App selecione Blank e marque Android e clique em Create;

Nota: Eu vou criar um projeto mobile apenas para Android.

Projeto criado agora vamos atualizar o Xamarin Forms.

No meu Tools abra o Manage Nuget Packages for Solution e a seguir clique em Updates , marque Xamarin.Forms (se ele aparecer) e atualize a versão do Xamarin Forms no projeto.

Incluindo os pacotes no projeto

1- No menu Tools clique em Nuget Package Manager -> Mange Nuget Packages for Solution

2- Clique em Browse e digite : Xamarin.Forms.GoogleMaps

3- Selecione o item encontrado, marque todos os projetos e clique no botão Install

Repita o procedimento e inclua também o pacote : Plugin.CurrentActivity

Este plug-in oferece aos desenvolvedores e criadores de bibliotecas acesso fácil à atividade atual de um aplicativo Android que está sendo exibido.

Vamos agora definir as configurações dos projetos.

Definindo as configurações nos projetos

No projeto compartilhado vamos criar uma pasta Constants e dentro desta pasta vamos criar o arquivo AppConstants.cs e definir o código abaixo neste arquivo:

  public class AppConstants
  {
        public const string GoogleMapsApiKey = "AIzaSyAQYHGTFR1A3eTar_tPdamjguklO7tNxxUY";
   }

Aqui estamos criando uma constante e atribuindo o valor da API KEY que vamos usar para acessar a API do Google Maps.

A seguir abra o arquivo MainActivity no projeto Android e no método OnCreate inclua as linhas em azul como mostrado a seguir:

      ...
      protected override void OnCreate(Bundle savedInstanceState)
        {
            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar;
            base.OnCreate(savedInstanceState);
            CrossCurrentActivity.Current.Init(this, savedInstanceState);
            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);           
            Xamarin.FormsGoogleMaps.Init(this, savedInstanceState); 
            LoadApplication(new App());
        }

Crie no projeto Android o arquivo MainApplication.cs e inclua neste arquivo o conteúdo abaixo:

#if DEBUG
using Android.App;
using Android.Runtime;
using Plugin.CurrentActivity;
using System;
using XF_GoogleMaps.Constants;
[Application(Debuggable = true)]
#else
	[Application(Debuggable = false)]
#endif
[MetaData("com.google.android.maps.v2.API_KEY",Value =AppConstants.GoogleMapsApiKey)]
public class MainApplication : Application
{
        public MainApplication(IntPtr handle, JniHandleOwnership transer)
          : base(handle, transer)
        {}
        public override void OnCreate()
        {
            base.OnCreate();
            CrossCurrentActivity.Current.Init(this);
        }
}

Note que estamos usando na tag MetaData o valor da nossa API Key definida em AppConstants.

A seguir abra o arquivo AndroidManifest.xml e inclua o código abaixo neste arquivo:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.companyname.xf_googlemaps" android:installLocation="auto">
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28" />

<application android:label="XF_GoogleMaps.Android" android:theme="@style/MainTheme">

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

</application>

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
</manifest>

Aqui definimos o acesso aos recursos necessários e na tag <application> incluímos a linha de código a seguir:
<uses-library android:name="org.apache.http.legacy" android:required="false"/>

Definindo a exibição do Mapa

Agora estamos prontos para exibir o mapa e para começar vamos exibir uma localização de um endereço.

Abra o arquivo MainPage.xaml e inclua o código abaixo:

<?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:maps="clr-namespace:Xamarin.Forms.GoogleMaps;assembly=Xamarin.Forms.GoogleMaps"
             x:Class="XF_GoogleMaps.MainPage">
    <maps:Map x:Name="map"/>
</ContentPage>

Finalmente no arquivo MainPage.xaml.cs vamos definir as coordenadas e o endereço a ser exibido no Mapa.

using System.ComponentModel;
using Xamarin.Forms;
using Xamarin.Forms.GoogleMaps;
namespace XF_GoogleMaps
{
    [DesignTimeVisible(false)]
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();

            Pin pinPaulista = new Pin()
            {
                Type = PinType.Place,
                Label = "Paulista",
                Address = "Av. Paulista 100 - Bela Vista",
                Position = new Position(-23.557d, -46.660d),
                Tag = "id_paulista",
            };

            map.Pins.Add(pinPaulista);

            map.MoveToRegion(MapSpan.FromCenterAndRadius(pinPaulista.Position, 
                Distance.FromMeters(5000)));
        }
    }
}

Agora é só alegria...

Para exibir o mapa eu vou usar o meu dispositivo físico (não vou usar um emulador).

Para espelhar o meu dispositivo no Windows 10 eu estou usando o Vysor. Para saber mais leia o meu artigo :
Xamarin - Espelhando seu dispositivo no Win10 com Vysor

Executando o projeto teremos o resultado abaixo:

Pegue o projeto sem as referências aqui: XF_GoogleMaps.zip

"E a paz de Deus, que excede todo o entendimento, guardará os vossos corações e os vossos pensamentos em Cristo Jesus."
Filipenses 4:7

Referências:


José Carlos Macoratti