Mono для Android - Запись голоса - PullRequest
2 голосов
/ 02 января 2012

Мне интересно, как записать голос, используя Mono для Android. Я видел различные материалы для записи голоса под Android, но ни один из них, похоже, не охватывает тему версии Mono.

Спасибо.

1 Ответ

4 голосов
/ 03 января 2012

Вот базовый пример, который использует аудиорекордер по умолчанию и записывает звук в формате .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>
...