Question

I'm wondering how to record voice using Mono for Android. I've seen various materials for recording voice under Android, but none of them seems to cover the Mono version topic.

Thanks.

Was it helpful?

Solution

Here is a basic example that uses the default audiorecorder and records audio to .3gp format. It has an activity with a couple of buttons and a textview that displays a timer as you record your audio.

Activity (AudoRecorderActivity.cs):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using System.Timers;
using System.Threading;

namespace App.MonoDroid {
    [Activity (Label = "Record Audio")]
    public class AudioRecorderActivity : Activity {
        Button btnStart;
        Button btnStop;
        public TextView tvTime;
        private System.Timers.Timer tm;
        private TimeSpan m_offset;
        private DateTime m_startTime;
        private const string STOPWATCH_ZERO = "00:00:00";
        AudioRecorder rec;
        private string FileName;
        bool isStarted = false;

        protected override void OnCreate (Bundle bundle)
        {
            base.OnCreate (bundle);
            SetContentView (Resource.Layout.audiorecorder);
            btnStart = FindViewById<Button> (Resource.Id.btnStart);
            btnStart.Click += new EventHandler (btnStart_Click); 
            tvTime = FindViewById<TextView> (Resource.Id.tvTimer);
            btnStop = FindViewById<Button> (Resource.Id.btnStop);
            btnStop.Click += new EventHandler (btnStop_Click);
            m_offset = new TimeSpan (0);
            m_startTime = DateTime.Now;
            tvTime.SetText (STOPWATCH_ZERO, TextView.BufferType.Normal);
        }

        void btnStop_Click (object sender, EventArgs e)
        {
            this.Finish ();
        }

        void btnStart_Click (object sender, EventArgs e)
        {
          //Check if SD card is mounted
            if (Android.OS.Environment.ExternalStorageState.Equals (Android.OS.Environment.MediaMounted)) {
                if (isStarted) {
                    tm.Stop ();
                    rec.Stop ();
                    rec = null;
                    Finish ();
                }
                else {
                    rec = new AudioRecorder (Android.OS.Environment.ExternalStorageDirectory.AbsolutePath
                    + "/Android/data/" + this.Application.PackageName, "audiotest.3gp");
                    m_offset = TimeSpan.Parse (tvTime.Text);
                    m_startTime = DateTime.Now;
                    tm = new System.Timers.Timer (1000.0);
                    tm.Elapsed += new ElapsedEventHandler (tm_Elapsed);
                    tm.Start ();
                    rec.Start ();
                    isStarted = true;
                    btnStart.Text = GetString ("Stop");
                }
            }
        }

        protected override void OnPause ()
        {
            base.OnPause ();
            this.Save ();
        }

        void tm_Elapsed (object sender, ElapsedEventArgs e)
        {
            DisplayTime ();
        }

        private void DisplayTime ()
        {
            TimeSpan elapsed = (DateTime.Now - m_startTime) + m_offset;
            RunOnUiThread (() => tvTime.SetText (String.Format ("{0:00}:{1:00}:{2:00}", 
                (int)elapsed.TotalHours, elapsed.Minutes, elapsed.Seconds), TextView.BufferType.Normal));
        }

        //Stop the activity from being rotated so that the timer/recording isn't stopped. 
        public override void OnConfigurationChanged (Android.Content.Res.Configuration newConfig)
        {
            base.OnConfigurationChanged (newConfig);
            SetRequestedOrientation ((Android.Content.PM.ScreenOrientation)this.RequestedOrientation);
        }
    }
}

Layout file (audiorecorder.axml):

<?xml version="1.0" encoding="utf-8" ?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:orientation="vertical"
>

  <TextView
    android:id="@+id/tvTimer"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textSize="100px"
    android:gravity="center_horizontal"
    />
  <LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:weightSum="100"
    android:orientation="horizontal"
    >
    <Button
      android:id="@+id/btnStart"
      android:text="@string/Start"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:layout_weight="50"
      />
    <Button
      android:id="@+id/btnStop"
      android:text="@string/CancelButton"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:layout_weight="50"
      />
  </LinearLayout>
</LinearLayout>
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top