首先要了解andriod开发中andriod多媒体框架包含了什么,它包含了获取和编码多种音频格式的支持,因此你几耍轻松把音频合并到你的应用中,若设备支持,使用MediaRecorder APIs便可以完成录音。

本文将会为你展示一下,如何写一个应用从设备上的microphone获取音频,并进行保存和回放.注意哈Android模拟器,是不具有录音的功能的,不过呢真实的设备一般都具有此功能.

如何进行音频获取

从设备获取音频比回放音频或视频要复杂一点,但是也还算简单:

  • 创建一个android.media.MediaRecorder的新实例.
  • 使用MediaRecorder.setAudioSource()设置音频源,一般要使用MediaRecorder.AudioSource.MIC.
  • 使用MediaRecorder.setOutputFormat()设置输出文件的格式.
  • 使用MediaRecorder.setOutputFile()设置输出文件的名字.
  • 使用MediaRecorder.setAudioEncoder()设置音频编码.
  • 调用MediaRecorder 实例的MediaRecorder.prepare().
  • MediaRecorder.start()开始获取音频.
  • 调用MediaRecorder.stop().停止.
  • 当你用完MediaRecorder实例后,调用MediaRecorder.release(),就会立即释放资源.

录音,然后回放录音的例子

下面的例子演示了如何设置,开始以及停止音频获取,以及回放录制的文件.

[java] view plaincopyprint?

  1. /*
  2. * 如果输出文件被写入外部存储,
  3. * 本应用需要具有写外部存储的权限,
  4. * 还要具有录音的权限.这些权限必须
  5. * 在AndroidManifest.xml 文件中声明,像这样:
  6. *
  7. * <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  8. * <uses-permission android:name="android.permission.RECORD_AUDIO" />
  9. *
  10. 10.  */

11. package com.android.audiorecordtest;

  1. 12.

13. import android.app.Activity;

14. import android.widget.LinearLayout;

15. import android.os.Bundle;

16. import android.os.Environment;

17. import android.view.ViewGroup;

18. import android.widget.Button;

19. import android.view.View;

20. import android.view.View.OnClickListener;

21. import android.content.Context;

22. import android.util.Log;

23. import android.media.MediaRecorder;

24. import android.media.MediaPlayer;

  1. 25.

26. import java.io.IOException;

  1. 27.
  2. 28.

29. public class AudioRecordTest extends Activity

30. {

  1. 31.     private static final String LOG_TAG = "AudioRecordTest";
  2. 32.     private static String mFileName = null;

33.    //录音按钮

  1. 34.     private RecordButton mRecordButton = null;
  2. 35.     private MediaRecorder mRecorder = null;

36.    //回放按钮

  1. 37.     private PlayButton   mPlayButton = null;
  2. 38.     private MediaPlayer   mPlayer = null;
  3. 39.

40.    //当录音按钮被click时调用此方法,开始或停止录音

  1. 41.     private void onRecord(boolean start) {
  2. 42.         if (start) {
  3. 43.             startRecording();
  4. 44.         } else {
  5. 45.             stopRecording();
  6. 46.         }
  7. 47.     }
  8. 48.

49.    //当播放按钮被click时调用此方法,开始或停止播放

  1. 50.     private void onPlay(boolean start) {
  2. 51.         if (start) {
  3. 52.             startPlaying();
  4. 53.         } else {
  5. 54.             stopPlaying();
  6. 55.         }
  7. 56.     }
  8. 57.
  9. 58.     private void startPlaying() {
  10. 59.         mPlayer = new MediaPlayer();
  11. 60.         try {

61.     //设置要播放的文件

  1. 62.             mPlayer.setDataSource(mFileName);
  2. 63.             mPlayer.prepare();

64.     //播放之

  1. 65.             mPlayer.start();
  2. 66.         } catch (IOException e) {
  3. 67.             Log.e(LOG_TAG, "prepare() failed");
  4. 68.         }
  5. 69.     }
  6. 70.
  7. 71.     //停止播放
  8. 72.     private void stopPlaying() {
  9. 73.         mPlayer.release();
  10. 74.         mPlayer = null;
  11. 75.     }
  12. 76.
  13. 77.     private void startRecording() {
  14. 78.         mRecorder = new MediaRecorder();
  15. 79.         //设置音源为Micphone
  16. 80.         mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
  17. 81.         //设置封装格式
  18. 82.         mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
  19. 83.         mRecorder.setOutputFile(mFileName);
  20. 84.         //设置编码格式
  21. 85.         mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
  22. 86.
  23. 87.         try {
  24. 88.             mRecorder.prepare();
  25. 89.         } catch (IOException e) {
  26. 90.             Log.e(LOG_TAG, "prepare() failed");
  27. 91.         }
  28. 92.
  29. 93.         mRecorder.start();
  30. 94.     }
  31. 95.
  32. 96.     private void stopRecording() {
  33. 97.         mRecorder.stop();
  34. 98.         mRecorder.release();
  35. 99.         mRecorder = null;
  36. }
  37. //定义录音按钮
  38. class RecordButton extends Button {
  39. boolean mStartRecording = true;
  40. OnClickListener clicker = new OnClickListener() {
  41. public void onClick(View v) {
  42. onRecord(mStartRecording);
  43. if (mStartRecording) {
  44. setText("Stop recording");
  45. } else {
  46. setText("Start recording");
  47. }
  48. mStartRecording = !mStartRecording;
  49. }
  50. };
  51. public RecordButton(Context ctx) {
  52. super(ctx);
  53. setText("Start recording");
  54. setOnClickListener(clicker);
  55. }
  56. }
  57. //定义播放按钮
  58. class PlayButton extends Button {
  59. boolean mStartPlaying = true;
  60. OnClickListener clicker = new OnClickListener() {
  61. public void onClick(View v) {
  62. onPlay(mStartPlaying);
  63. if (mStartPlaying) {
  64. setText("Stop playing");
  65. } else {
  66. setText("Start playing");
  67. }
  68. mStartPlaying = !mStartPlaying;
  69. }
  70. };
  71. public PlayButton(Context ctx) {
  72. super(ctx);
  73. setText("Start playing");
  74. setOnClickListener(clicker);
  75. }
  76. }
  77. //构造方法
  78. public AudioRecordTest() {
  79. mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
  80. mFileName += "/audiorecordtest.3gp";
  81. }
  82. @Override
  83. public void onCreate(Bundle icicle) {
  84. super.onCreate(icicle);
  85. //构造界面
  86. LinearLayout ll = new LinearLayout(this);
  87. mRecordButton = new RecordButton(this);
  88. ll.addView(mRecordButton,
  89. new LinearLayout.LayoutParams(
  90. ViewGroup.LayoutParams.WRAP_CONTENT,
  91. ViewGroup.LayoutParams.WRAP_CONTENT,
  92. 0));
  93. mPlayButton = new PlayButton(this);
  94. ll.addView(mPlayButton,
  95. new LinearLayout.LayoutParams(
  96. ViewGroup.LayoutParams.WRAP_CONTENT,
  97. ViewGroup.LayoutParams.WRAP_CONTENT,
  98. 0));
  99. setContentView(ll);
  100. }
  101. @Override
  102. public void onPause() {
  103. super.onPause();
  104. //Activity暂停时释放录音和播放对象
  105. if (mRecorder != null) {
  106. mRecorder.release();
  107. mRecorder = null;
  108. }
  109. if (mPlayer != null) {
  110. mPlayer.release();
  111. mPlayer = null;
  112. }
  113. }
  114. }

本文来自麦子学院:http://www.maiziedu.com/ /*

* 如果输出文件被写入外部存储,

* 本应用需要具有写外部存储的权限,

* 还要具有录音的权限.这些权限必须

* 在AndroidManifest.xml 文件中声明,像这样:

*

* <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

* <uses-permission android:name="android.permission.RECORD_AUDIO" />

*

*/

package com.android.audiorecordtest;

import android.app.Activity;

import android.widget.LinearLayout;

import android.os.Bundle;

import android.os.Environment;

import android.view.ViewGroup;

import android.widget.Button;

import android.view.View;

import android.view.View.OnClickListener;

import android.content.Context;

import android.util.Log;

import android.media.MediaRecorder;

import android.media.MediaPlayer;

import java.io.IOException;

public class AudioRecordTest extends Activity

{

private static final String LOG_TAG = "AudioRecordTest";

private static String mFileName = null;

   //录音按钮

private RecordButton mRecordButton = null;

private MediaRecorder mRecorder = null;

   //回放按钮

private PlayButton   mPlayButton = null;

private MediaPlayer   mPlayer = null;

   //当录音按钮被click时调用此方法,开始或停止录音

private void onRecord(boolean start) {

if (start) {

startRecording();

} else {

stopRecording();

}

}

   //当播放按钮被click时调用此方法,开始或停止播放

private void onPlay(boolean start) {

if (start) {

startPlaying();

} else {

stopPlaying();

}

}

private void startPlaying() {

mPlayer = new MediaPlayer();

try {

    //设置要播放的文件

mPlayer.setDataSource(mFileName);

mPlayer.prepare();

    //播放之

mPlayer.start();

} catch (IOException e) {

Log.e(LOG_TAG, "prepare() failed");

}

}

//停止播放

private void stopPlaying() {

mPlayer.release();

mPlayer = null;

}

private void startRecording() {

mRecorder = new MediaRecorder();

//设置音源为Micphone

mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);

//设置封装格式

mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

mRecorder.setOutputFile(mFileName);

//设置编码格式

mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

try {

mRecorder.prepare();

} catch (IOException e) {

Log.e(LOG_TAG, "prepare() failed");

}

mRecorder.start();

}

private void stopRecording() {

mRecorder.stop();

mRecorder.release();

mRecorder = null;

}

//定义录音按钮

class RecordButton extends Button {

boolean mStartRecording = true;

OnClickListener clicker = new OnClickListener() {

public void onClick(View v) {

onRecord(mStartRecording);

if (mStartRecording) {

setText("Stop recording");

} else {

setText("Start recording");

}

mStartRecording = !mStartRecording;

}

};

public RecordButton(Context ctx) {

super(ctx);

setText("Start recording");

setOnClickListener(clicker);

}

}

//定义播放按钮

class PlayButton extends Button {

boolean mStartPlaying = true;

OnClickListener clicker = new OnClickListener() {

public void onClick(View v) {

onPlay(mStartPlaying);

if (mStartPlaying) {

setText("Stop playing");

} else {

setText("Start playing");

}

mStartPlaying = !mStartPlaying;

}

};

public PlayButton(Context ctx) {

super(ctx);

setText("Start playing");

setOnClickListener(clicker);

}

}

//构造方法

public AudioRecordTest() {

mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();

mFileName += "/audiorecordtest.3gp";

}

@Override

public void onCreate(Bundle icicle) {

super.onCreate(icicle);

//构造界面

LinearLayout ll = new LinearLayout(this);

mRecordButton = new RecordButton(this);

ll.addView(mRecordButton,

new LinearLayout.LayoutParams(

ViewGroup.LayoutParams.WRAP_CONTENT,

ViewGroup.LayoutParams.WRAP_CONTENT,

0));

mPlayButton = new PlayButton(this);

ll.addView(mPlayButton,

new LinearLayout.LayoutParams(

ViewGroup.LayoutParams.WRAP_CONTENT,

ViewGroup.LayoutParams.WRAP_CONTENT,

0));

setContentView(ll);

}

@Override

public void onPause() {

super.onPause();

//Activity暂停时释放录音和播放对象

if (mRecorder != null) {

mRecorder.release();

mRecorder = null;

}

if (mPlayer != null) {

mPlayer.release();

mPlayer = null;

}

}

}

本文来自麦子学院:http://www.maiziedu.com/ /*

Android开发教程 录音和播放的更多相关文章

  1. Android开发教程大全介绍

    Android是由谷歌在2007年推出的一个开放系统平台,主要针对移动设备市场,目前版本为Android 4.0.Android基于Linux,开发者可以使用Java或C/C++开发Android应用 ...

  2. ArcGIS Runtime for Android开发教程V2.0(4)基础篇---MapView

    原文地址: ArcGIS Runtime for Android开发教程V2.0(4)基础篇---MapView - ArcGIS_Mobile的专栏 - 博客频道 - CSDN.NET http:/ ...

  3. ArcGIS Runtime for Android开发教程V2.0(3)基础篇---Hello World Map

    原文地址: ArcGIS Runtime for Android开发教程V2.0(3)基础篇---Hello World Map - ArcGIS_Mobile的专栏 - 博客频道 - CSDN.NE ...

  4. ArcGIS Runtime for Android开发教程V2.0(2)开发环境配置

    原文地址: ArcGIS Runtime for Android开发教程V2.0(2)开发环境配置 - ArcGIS_Mobile的专栏 - 博客频道 - CSDN.NET http://blog.c ...

  5. ArcGIS Runtime for Android开发教程V2.0(1)基本概念

    原文地址: ArcGIS Runtime for Android开发教程V2.0(1)基本概念 - ArcGIS_Mobile的专栏 - 博客频道 - CSDN.NET http://blog.csd ...

  6. 【Android 开发教程】动态添加Fragments

    本章节翻译自<Beginning-Android-4-Application-Development>,如有翻译不当的地方,敬请指出. 原书购买地址http://www.amazon.co ...

  7. 收集整理Android开发所需的Android SDK、开发中用到的工具、Android开发教程、Android设计规范,免费的设计素材等。

    AndroidDevTools Android Dev Tools官网地址:www.androiddevtools.cn 收集整理Android开发所需的Android SDK.开发中用到的工具.An ...

  8. 李洪强iOS开发之录音和播放实现

    李洪强iOS开发之录音和播放实现 //首先导入框架后,导入头文件.以下内容为托控件,在storyboard中拖出两个按钮为录音和播放按钮 //创建一个UIViewController在.h文件中写 # ...

  9. Android开发教程AnimationDrawable逐帧播放动画

    下面我们一起来看篇Android开发AnimationDrawable控制逐帧播放动画实现过程,希望文章对各位朋友带不一些帮助. 当我们点击按钮时,该图片会不停的旋转,当再次点击按钮时,会停止在当前的 ...

随机推荐

  1. 使用POI读取excel文件内容

    1.前言 项目中要求读取excel文件内容,并将其转化为xml格式.常见读取excel文档一般使用POI和JExcelAPI这两个工具.这里我们介绍使用POI实现读取excel文档. 2.代码实例: ...

  2. Jmeter+jenkins接口性能测试平台实践整理(一)

    最近两周在研究jmeter+Jenkin的性能测试平台测试dubbo接口,分别尝试使用maven,ant和Shell进行构建,jmeter相关设置略. 一.Jmeter+jenkins+Shell+t ...

  3. springmvc笔记(来自慕课网)

    1.准备工作:springmvc相关的jar包. 2.这里我们先用eclipse来操作. 首先看一个接口编程,后面的所有知识点都是通过这个接口编程引出的. OneInterface.java pack ...

  4. 算法库:jpeglib和pnglib安装配置

    类似于OpenCV的安装配置.只不过OpenCV有编译好的,而jpeglib和pnglib需要自己编译.其实,若要跟踪OpenCV的源码或要使用OpenCV的扩展包,OpenCV也得自己编译. Ope ...

  5. Eclipse 常用设置

    1. eclipse中的汉字横着显示怎么解决 同一种字体有两种显示方式,比如Fixedsys Excelsior 3.01和@Fixedsys Excelsior 3.01,前一种汉字是竖着显示,后一 ...

  6. SecureCRT的背景和文字颜色的修改

    options->;session options->;emulation->;terminal选择linux(相应的服务器系统)ansi color 打上钩options-> ...

  7. 巧用Freemarker的自定义方法

    要想使用Freemarker支持的自定义方法,需要实现freemarker.template.TemplateMethodModel接口,然后将方法对象放入到Freemarker的数据模型中,这样在f ...

  8. 如何下载spring-framework

    http://jingyan.baidu.com/album/a65957f49670ac24e67f9b85.html?picindex=1

  9. (转)由Uploadify插件想到的Flash无法传递Session和Cookie的问题解决

    在ASP.NET MVC3中使用Uploadify上传文件时发现,在后台需要验证登录状态的时候,Uploadify根本无法完成验证,因此,在后台只能使用非验证状态进行文件上传 —— 众所周知,这无异于 ...

  10. JavaScript对象的创建之工厂方法

    通过工厂的方式来创建Person对象,在createPerson中创建一个对象,然后为这个对象设置相应的属性和方法,之后返回这个对象. function createPerson(name, age) ...