简体   繁体   English

适用于Android的Mono-录音

[英]Mono for Android - Voice Recording

I'm wondering how to record voice using Mono for Android. 我想知道如何使用Android版Mono录制语音。 I've seen various materials for recording voice under Android, but none of them seems to cover the Mono version topic. 我已经看过用于在Android下录制语音的各种材料,但是似乎都没有涵盖Mono版本的主题。

Thanks. 谢谢。

Here is a basic example that uses the default audiorecorder and records audio to .3gp format. 这是一个使用默认音频记录器并将音频记录为.3gp格式的基本示例。 It has an activity with a couple of buttons and a textview that displays a timer as you record your audio. 它具有一个带有几个按钮的活动和一个文本视图,该视图在您录制音频时显示一个计时器。

Activity (AudoRecorderActivity.cs): 活动(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): 布局文件(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>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM