Gravar áudio – Xamarin.Forms

Olá, neste artigo irei demonstrar como implementar um gravador de áudio em suas aplicações Xamarin.Forms.

 

ADICIONANDO O NUGET PACKAGE

Para o exemplo será utilizado o plugin AudioRecorder, instale o plugin em todos os seus projetos (Compartilhado / Android / iOS).

Screen Shot 2019-04-24 at 23.28.11

 

Android

Para a plataforma Android, adicione as permissões no arquivo AndroidManifest, como demonstrado a seguir.

<?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="br.com.julianocustodo.audiodemo">
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="27" />
<application android:label="AudioDemo.Android"></application>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
</manifest>

view raw
AndroidManifest.xml
hosted with ❤ by GitHub

 

No arquivo MainActivity, adicione uma verificação de permissão no método OnCreate, antes da chamada do método LoadApplication.

using System;
using Android.App;
using Android.Content.PM;
using Android.Runtime;
using Android.OS;
using Android.Support.V4.Content;
using Android.Support.V4.App;
using Android;
namespace AudioDemo.Droid
{
[Activity(Label = "AudioDemo", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
protected override void OnCreate(Bundle savedInstanceState)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
//Verifica se tem permissão
if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.RecordAudio) != Permission.Granted)
{
ActivityCompat.RequestPermissions(this, new String[] { Manifest.Permission.RecordAudio }, 1);
}
LoadApplication(new App());
}
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);
}
}
}

view raw
MainActivity.cs
hosted with ❤ by GitHub

 

 

iOS

Para a plataforma iOS edite o arquivo Info.plist e adicione a permissão como demonstrado a seguir.

<key>NSMicrophoneUsageDescription</key>
<string>The AudioDemo wants to use your microphone to record audio.</string>
</dict>
</plist>

view raw
Info.plist
hosted with ❤ by GitHub

 

XAML

Para este exemplo, crie um Switch que será utilizado como opção para parar a gravação após um determinado tempo de silêncio. Crie também um Button para acionar a gravação e um Button para reproduzir o audio gravado.

<?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:AudioDemo"
x:Class="AudioDemo.MainPage" Padding="20,80,20,0">
<StackLayout Spacing="15">
<StackLayout Orientation="Horizontal">
<Switch x:Name="TimeoutSwitch" IsToggled="True" />
<Label Text="Parar após silêncio?" />
</StackLayout>
<Button x:Name="GravarButton"
Text="Gravar"
Clicked="Gravar_Clicked"/>
<Button x:Name="ReproduzirButton"
Text="Reproduzir"
Clicked="Reproduzir_Clicked"
IsEnabled="False" />
</StackLayout>
</ContentPage>

view raw
MainPage.xaml
hosted with ❤ by GitHub

 

C#

Referencie o plugin AudioRecorder e crie um objeto do tipo AudioRecorderService que será utilizado para gravar, e um objeto do tipo AudioPlayer que será utilizado para reproduzir o áudio captado na gravação. Instancie os objetos como demonstrado a seguir.

using System;
using System.ComponentModel;
using Plugin.AudioRecorder;
using Xamarin.Forms;
namespace AudioDemo
{
[DesignTimeVisible(true)]
public partial class MainPage : ContentPage
{
AudioRecorderService gravador;
AudioPlayer reprodutor;
public MainPage()
{
InitializeComponent();
gravador = new AudioRecorderService
{
StopRecordingAfterTimeout = true,
TotalAudioTimeout = TimeSpan.FromSeconds(15),
AudioSilenceTimeout = TimeSpan.FromSeconds(2)
};
reprodutor = new AudioPlayer();
reprodutor.FinishedPlaying += Finaliza_Reproducao;
}
public async void Gravar_Clicked(object sender, EventArgs e)
{
}
public async void Reproduzir_Clicked(object sender, EventArgs e)
{
}
public void Finaliza_Reproducao(object sender, EventArgs e)
{
}
}
}

view raw
MainPage.xaml.cs
hosted with ❤ by GitHub

 

 

Gravar

O método para gravar neste exemplo terá duas funções.

  1. Se não estiver gravando, começar a gravar.
  2. Se estiver gravando, parar de gravar.
public async void Gravar_Clicked(object sender, EventArgs e)
{
try
{
if (!gravador.IsRecording)
{
gravador.StopRecordingOnSilence = TimeoutSwitch.IsToggled;
GravarButton.IsEnabled = false;
ReproduzirButton.IsEnabled = false;
//Começar gravação
var audioRecordTask = await gravador.StartRecording();
GravarButton.Text = "Parar Gravação";
GravarButton.IsEnabled = true;
await audioRecordTask;
GravarButton.Text = "Gravar";
ReproduzirButton.IsEnabled = true;
}
else
{
GravarButton.IsEnabled = false;
//parar a gravação…
await gravador.StopRecording();
GravarButton.IsEnabled = true;
}
}
catch (Exception ex)
{
await DisplayAlert("Erro", ex.Message, "OK");
}
}

 

 

Reproduzir

O método reproduzir, ficará encarregado de pegar o audio do objeto gravador e reproduzi-lo, utilizando o método Play do objeto chamado reprodutor.

public async void Reproduzir_Clicked(object sender, EventArgs e)
{
try
{
var filePath = gravador.GetAudioFilePath();
if (filePath != null)
{
ReproduzirButton.IsEnabled = false;
GravarButton.IsEnabled = false;
reprodutor.Play(filePath);
}
}
catch (Exception ex)
{
await DisplayAlert("Erro", ex.Message, "OK");
}
}

 

 

Finalizar

O método de finalização é responsável apenas em liberar os botões novamente.

public void Finaliza_Reproducao(object sender, EventArgs e)
{
ReproduzirButton.IsEnabled = true;
GravarButton.IsEnabled = true;
}

 

 

Resultado

ezgif.com-video-to-gif

 

 

Esse e todos os exemplos deste blog encontram-se disponíveis no GitHub.

icongithub

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s