Usando bibliotecas nativas do Android

Neste exemplo o projeto principal do Xamarin Forms tem o nome "XamarinTest".

Na solution, crie um projeto do tipo "Android Bindings Library (Xamarin)" (em português: "Biblioteca de Associações"). Neste exemplo, o projeto recebeu o nome "SystemUtilities".

Projeto de Bindings

Adicione o arquivo da biblioteca do Android (arquivo .aar) à pasta Jars do projeto de Bindings. Neste exemplo, a biblioteca tem o nome SystemUtilities.aar.

Adicionando .aar

Clique com o botão direito no arquivo SystemUtilities.aar, clique em "Properties".

Propriedades do .aar

Na propriedade Build Action, selecione a opção LibraryProjectZip.

Build action do .aar

No projeto "XamarinTest.Android" (ou seu equivalente NOME_DO_PROJETO.Android), crie um arquivo .cs com a classe "SystemUtilitiesAdapter_Android". Esta classe será um wrapper envolvendo as chamadas às classes da biblioteca .aar do Android. Esta classe deve:

  • Incluir o atributo [assembly: Dependency(typeof(SystemUtilitiesAdapter_Android))]
  • Herdar da classe Java.Lang.Object
  • Implementar a interface ISystemUtilitiesAdapter

A classe, então, deve ficar assim:

1
2
3
4
5
6
7
[assembly: Dependency(typeof(SystemUtilitiesAdapter_Android))]
namespace XamarinTest.Droid
{
    public class SystemUtilitiesAdapter_Android : Java.Lang.Object, ISystemUtilitiesAdapter
    {
        /*  Métodos aqui */
    }

A interface ISystemUtilitiesAdapter deve ser definida no projeto principal, por exemplo:

Interface do adaptador

Esta interface define os métodos que serão expostos pelo wrapper adaptador.

A biblioteca SystemUtilities.aar possui outros métodos além dos mostrados aqui, mas este adaptador de exemplo só expõe os 5 métodos mostrados na figura acima.

A implementação completa da classe ficaria assim:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
using System;
using Com.Victorvision.Androidsystemutilities;
using Xamarin.Forms;
using XamarinTest.Droid;
using XamarinTest.Views;

/* Este atributo registra esta classe como uma dependência que pode ser usada
   na aplicação principal */
[assembly: Dependency(typeof(SystemUtilitiesAdapter_Android))]
namespace XamarinTest.Droid
{
    public class SystemUtilitiesAdapter_Android : Java.Lang.Object, ISystemUtilitiesAdapter
    {
        public void HideBars()
        {
            SystemUtilities.HideBars();
        }
        public void ShowBars()
        {
            SystemUtilities.ShowBars();
        }

        public void SoundBuzzer(int duration)
        {
            SystemUtilities.SoundBuzzer(duration);
        }

        public void TurnBuzzerOn()
        {
            SystemUtilities.TurnBuzzerOn();
        }

        public void TurnBuzzerOff()
        {
            SystemUtilities.TurnBuzzerOff();
        }
    }
}

Esta classe, agora, pode ser utilizada no projeto principal, resolvendo a dependência nos views que a utilização, por exemplo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using System;
using System.ComponentModel;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace XamarinTest.Views
{
    public partial class AboutPage : ContentPage
    {
        /* Referência a uma instância do SystemUtilitiesAdapter */
        private readonly ISystemUtilitiesAdapter _systemUtilitiesAdapter;

        public AboutPage()
        {
            InitializeComponent();

            /* Resolvendo a dependência e inicializando uma instância do SystemUtilitiesAdapter */
            _systemUtilitiesAdapter = DependencyService.Get<ISystemUtilitiesAdapter>();
        }

        /* Event handlers dos botões na UI que usam a biblioteca */
        private void Button5_OnClicked(object sender, EventArgs e)
        {
            _systemUtilitiesAdapter.ShowBars();
        }

        private void Button6_OnClicked(object sender, EventArgs e)
        {
            _systemUtilitiesAdapter.HideBars();
        }

        private void Button7_OnClicked(object sender, EventArgs e)
        {
            _systemUtilitiesAdapter.SoundBuzzer(100);
        }

        private void Button8_OnClicked(object sender, EventArgs e)
        {
            _systemUtilitiesAdapter.TurnBuzzerOn();
        }

        private void Button9_OnClicked(object sender, EventArgs e)
        {
            _systemUtilitiesAdapter.TurnBuzzerOff();
        }
    }
}
1
2
3
4
5
6
7
<!-- Um botão na UI, arquivo AboutPage.xaml -->

<Button Margin="0,10,0,0"
        Text="Sound Buzzer"
        Clicked="Button7_OnClicked"
        BackgroundColor="{StaticResource Primary}"
        TextColor="White" />

Desta maneira, qualquer biblioteca do Android .aar pode ser utilizada nativamente no Xamarin Forms. Basta seguir estes passos e substituir os nomes adequadamente.