适用于Android的Mono - 录音

时间:2012-01-02 10:42:50

标签: android mono xamarin.android voice-recording

我想知道如何使用Mono for Android录制语音。我见过各种用于在Android下录制语音的资料,但它们似乎都没有涵盖Mono版本主题。

感谢。

1 个答案:

答案 0 :(得分:4)

这是一个使用默认audiorecorder并将音频录制为.3gp格式的基本示例。 它有一个带有几个按钮的活动和一个在录制音频时显示计时器的文本视图。

活动(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);
        }
    }
}

布局文件(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>