【Android】20.4 录音
分类:C#、Android、VS2015;
创建日期:2016-03-13
一、简介
利用Android提供的MediaRecorder类可直接录制音频。
1、权限要求
录制音频和视频需要下面的权限:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2、基本设计步骤
(1)初始化和录制
录制音频的基本设计步骤如下:
(1) 创建MediaRecorder对象。
(2) 调用SetAudioSource方法指定使用哪个硬件设备捕获音频输入(比如麦克风)。
(3) 调用SetOutputFormat方法指定录音输出文件的格式。
(4) 调用SetAudioEncoder方法设置音频编码类型。
(5) 调用SetOutputFile方法指定输出的音频文件。
(6) 调用Prepare方法初始化录音器。
(7) 调用Start方法开始录音。
下面的代码演示了如何实现:
protected MediaRecorder recorder;
void RecordAudio (String filePath)
{
try {
if (File.Exists (filePath)) {
File.Delete (filePath);
}
if (recorder == null) {
recorder = new MediaRecorder (); // Initial state.
} else {
recorder.Reset ();
recorder.SetAudioSource (AudioSource.Mic);
recorder.SetOutputFormat (OutputFormat.ThreeGpp);
recorder.SetAudioEncoder (AudioEncoder.AmrNb);
// Initialized state.
recorder.SetOutputFile (filePath);
// DataSourceConfigured state.
recorder.Prepare (); // Prepared state
recorder.Start (); // Recording state.
}
} catch (Exception ex) {
Console.Out.WriteLine( ex.StackTrace);
}
}
(2)停止录音
调用MediaRecorder 的Stop方法停止录音:
recorder.Stop();
(3)清除录音占用的资源
一旦停止了MediaRecorder,调用Reset方法将其置于空闲状态(idle state):
recorder.Reset();
当不再使用MediaRecorder实例时,必须释放其占用的资源:
recorder.Release();
二、示例
该例子的功能是录制来自麦克风的音频,如果笔记本带有麦克风,可直接通过模拟器来观察运行效果。录制以后,可直接单击播放按钮测试录制的效果。
这同样也是一个简单的示例,没有考虑录音过程中电话打入的情况,也没有考虑其他复杂的控制。
1、运行截图

2、设计步骤
(1)AndroidManifest.xml文件
在该文件中添加下面的权限(如果有了就不用添加了)。
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
(2)添加ch2004Main.axml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button
android:id="@+id/ch2004_btnRecStart"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="开始录音" />
<Button
android:id="@+id/ch2004_btnRecStop"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="停止录音" />
<Button
android:id="@+id/ch2004_btnPlayStart"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="播放录音" />
<Button
android:id="@+id/ch2004_btnPlayStop"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="停止播放录音" />
<TextView
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/ch2004_textView1"
android:gravity="center_horizontal"
android:layout_marginTop="30dp" />
</LinearLayout>
(3)添加ch2004MainActivity.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 Android.Media; namespace MyDemos.SrcDemos
{
[Activity(Label = "ch2004MainActivity")]
[IntentFilter(new[] { Intent.ActionMain },
Categories = new[] { Intent.CategoryDefault, ch.MyDemosCategory })]
public class ch2004MainActivity : Activity
{
string filePath;
MediaRecorder recorder;
MediaPlayer player;
Button btnRecStart, btnRecStop, btnPlayStart, btnPlayStop;
TextView textView1; protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.ch2004Main);
//指定SD卡录制的音频文件路径
filePath = string.Format("{0}/{1}/myRecord.mp3",
Android.OS.Environment.ExternalStorageDirectory.Path,
Android.OS.Environment.DirectoryMusic);
textView1 = FindViewById<TextView>(Resource.Id.ch2004_textView1); btnRecStart = FindViewById<Button>(Resource.Id.ch2004_btnRecStart);
btnRecStart.Click += delegate
{
textView1.Text = "正在录音...";
try
{
StartRecorder();
}
catch (Exception ex)
{
Console.Out.WriteLine(ex.StackTrace);
}
}; btnRecStop = FindViewById<Button>(Resource.Id.ch2004_btnRecStop);
btnRecStop.Click += delegate
{
StopRecorder();
textView1.Text = "录音已停止。";
}; btnPlayStart = FindViewById<Button>(Resource.Id.ch2004_btnPlayStart);
btnPlayStart.Click += delegate
{
textView1.Text = "正在播放录音...";
try
{
player = new MediaPlayer();
player.Reset();
player.SetDataSource(filePath);
player.Prepare();
player.Start();
}
catch (Exception ex)
{
Console.WriteLine(ex.StackTrace);
}
};
btnPlayStop = FindViewById<Button>(Resource.Id.ch2004_btnPlayStop);
btnPlayStop.Click += delegate
{
player.Stop();
textView1.Text = "播放已停止。";
}; } private void StartRecorder()
{
try
{
if (System.IO.File.Exists(filePath))
{
System.IO.File.Delete(filePath);
}
if (recorder == null)
{
recorder = new MediaRecorder(); // Initial state.
}
else
{
recorder.Reset();
}
recorder.SetAudioSource(AudioSource.Mic); //录制来自麦克风的声音
recorder.SetOutputFormat(OutputFormat.Mpeg4);
recorder.SetAudioEncoder(AudioEncoder.AmrNb);
recorder.SetOutputFile(filePath);
recorder.Prepare();
recorder.Start();
}
catch (Exception ex)
{
Console.Out.WriteLine(ex.StackTrace);
}
} private void StopRecorder()
{
if (recorder != null)
{
recorder.Stop();
recorder.Release();
recorder = null;
}
}
}
}
在模拟器中观察运行的效果,单击【录音】按钮开始录音,录音完毕后,直接单击【播放录音】就可以测试录制效果。
【Android】20.4 录音的更多相关文章
- 【Android】【录音】Android录音--AudioRecord、MediaRecorder
[Android][录音]Android录音--AudioRecord.MediaRecorder Android提供了两个API用于实现录音功能:android.media.AudioRecord. ...
- Android 使用MediaRecorder录音
package com.example.HyyRecord; import android.app.Activity; import android.content.Intent; import an ...
- Android开发教程 录音和播放
首先要了解andriod开发中andriod多媒体框架包含了什么,它包含了获取和编码多种音频格式的支持,因此你几耍轻松把音频合并到你的应用中,若设备支持,使用MediaRecorder APIs便可以 ...
- Android 使用MediaRecorder录音调用stop()方法的时候报错【转】
本文转载自:http://blog.csdn.net/u014737138/article/details/49738827 这个问题在网上看到了太多的答案,一直提示说按照官网的api的顺序来,其实解 ...
- android 20 Intnet类重要的成员变量
Intnet类重要的成员变量: <intent-filter> <action android:name="android.intent.action.MAIN" ...
- [Exception Android 20] - Error:Execution failed for task ':app:processDebugResources'
Error:Execution failed for task ':app:processDebugResources'. > com.android.ide.common.process.Pr ...
- Android 实现电话录音(窃听)
配置文件 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android=&qu ...
- android中通话录音
file = new File(Environment.getExternalStorageDirectory(), this.incomeNumber + System.currentTimeMil ...
- Android录音应用
首先是xml布局文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xm ...
随机推荐
- Java 吸血鬼数字
非常羞愧(事实上没什么羞愧.水平就这样).搞了半晌才写出来了一个Java 版求四位吸血鬼数字的方法 吸血鬼数字是指位数为偶数的数字.能够由一对数字相乘而得到.而这对数字各包括乘积的一半位数的数字,当中 ...
- hdu1027 Ignatius and the Princess II (全排列 & STL中的神器)
转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=1027 Ignatiu ...
- Eclipse开发Android的配置(包括ADT安装,SDK配置)
1. 下载Android SDK http://code.google.com/android/download.html下载后直接解压就可以使用了. 为了在DOS控制台中直接使用SDK的工具,可 ...
- Eclipse中SVN修改的*星号没了,解决方法
Eclipse中SVN修改的*星号没了,解决方法 打开Preference 第一步:去掉外加的 ">" 第二步:勾选Outgoing changes 这样做之后," ...
- 电脑PE系统工具
自己收集的一些PE电脑维护工具 电脑店PE工具 http://u.diannaodian.com/ 通用PE工具箱 http://www.tongyongpe.com/ 大白菜PE工具 http:// ...
- Hadoop,HBase集群环境搭建的问题集锦(二)
10.艾玛, Datanode也启动不了了? 找到log: Caused by: java.net.UnknownHostException: Invalid host name: local hos ...
- Android 四大组件学习之BroadcastReceiver三
本节学习广播的分类. 广播分为无序广播和有序广播 无序广播: 广播发送者的action与广播接收者的action都匹配的话,所以广播介绍者都能够收到这条广播,而且没有先后顺序,能够觉得是同一时候收到 ...
- VB调用VC dll的返回方式
第一种类型:数值传递 注意:在VB中,默认变量传递方式为ByRef为地址,而传递值就是用ByVal,还要注意在C++中,int类型的变量是32位的,在VB中要用long型变量来配合.VC++部分: e ...
- 纯jascript解决手机端拍照、选图后图片被旋转问题
需要的js1 需要的js2 这里主要用到Orientation属性. Orientation属性说明如下: 旋转角度 参数 0° 1 顺时针90° 6 逆时针90° 8 180° 3 <!DOC ...
- windows下编辑的shell复制到linux无法执行
是因为格式不对 可用vim编辑器转换格式 在vim中执行命令: set ff=unix 设置打开方式为unix