首先要了解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. Category的使用

    1.创建一个objective-c file , 可以选择 category, extension ,protocol, empty 文件.选category 就能建立类别. category机制,它 ...

  2. 聚合查询中的Group by

    2005版本以上的sql server 查询中如果既包含聚合函数列(诸如sum ,count,avg,max等)又存在一般列的情况,则查询字符串结尾必须包含Group By [某一般列].  其实微软 ...

  3. 无侵入方面编程-用HttpModule+SoapExtension监视页面执行参数(一)

    先简单介绍一下项目吧,我们这个项目是用VS2003开发的,老早一个项目.WEB前端机+业务处理(WebService层)+数据库分别布置在不同的计算机上. 现在老总有一个需求,要统计出每个页面的执行时 ...

  4. 20145305 《Java程序设计》第6周学习总结

    教材学习内容总结 1.输入串流代表对象为java.io.InputStream实例,输出串流代表对象为java.io.OutputStream实例 2.InputStream与OutputStream ...

  5. orientationchange不管用啊

    首先引入JQuery Mobile包,将 <script> //手持设备方向改变时执行 $(window).bind( 'orientationchange', function(e){ ...

  6. centos 6.5 安装 buildbot-slave 0.8.9

    公司服务器多数都用的centos,这个是大环境,改不了,只好研究怎么安装buildbot-slave. buildbot-master倒是没有问题,可控,自己弄了一个ubuntu14来玩. cento ...

  7. px、pt、in、dp、dpi

        PPI 与 DPI ppi的运算方式是:PPI = √(长度像素数² + 宽度像素数²) / 屏幕对角线英寸数.即:长.宽各自平方之和的开方,再除以屏幕对角线的英寸数. 以iphone5为例, ...

  8. Django session 详解-part II-session

    Django中的session是一个高级工具,它可以让用户存储个人信息以便在下次访问网站中使用这些信息.session的基础还是cookie,但是它提供了一些更加高级的功能.请看下面的一个例子: 使用 ...

  9. (*medium)LeetCode 211.Add and Search Word - Data structure design

    Design a data structure that supports the following two operations: void addWord(word) bool search(w ...

  10. [POJ 3211] Washing Clothes (动态规划)

    题目链接:http://poj.org/problem?id=3211 题意:有M件衣服,每种衣服有一种颜色,一共有N种颜色.现在两个人洗衣服,规则是必须把这一种颜色的衣服全部洗完才能去洗下一种颜色的 ...