首先要了解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/ /*

最新文章

  1. 《Note --- Unreal --- MemPro (CONTINUE... ...)》
  2. ASP.NET MVC5+EF6+EasyUI 后台管理系统(17)-LinQ动态排序
  3. linux 下 apache相关;启动、停止、重启命令;配置文件位置等等
  4. JMeter基础之一 一个简单的性能测试
  5. wamp下php无法保存SESSION问题总汇
  6. HDU 1846 Brave Game(简单巴什博弈)
  7. Network Link Conditioner模拟不同网络环境
  8. Visual studio 2015程序转Eclipse gun编译出现的问题总结
  9. JVM参数配置大全
  10. 我的django之旅(二)模板和静态文件
  11. web代理进行跨域访问
  12. YC(Y Combinator)斯坦福大学《如何创业》课程要点记录(粗糙)
  13. GitHub上非常受开发者欢迎的iOS开源项目(二)
  14. Google Chrome 圆形进度条
  15. .NET中的线程与异步(笔记)
  16. Leetcode#88. Merge Sorted Array(合并两个有序数组)
  17. zzw原创-linux下ftp ipv6的unknown host 问题
  18. java的方法重载
  19. mysql-proxy 简介
  20. Ecplise通过Git将项目提交到GitHub

热门文章

  1. jQuery实现的美观的倒计时实例代码
  2. git 版本库回滚(转载)
  3. 论职务犯罪案件侦查 z
  4. 拥抱 Android Studio 之四:Maven 仓库使用与私有仓库搭建
  5. 不可变集合 Immutable Collections
  6. Informix如何释放异常的锁资源
  7. Inno Setup执行SQL脚本的方法
  8. .NET 集合操作性能
  9. HTTP 和 HTTPS 协议
  10. Wireshark &quot;The NPF driver isn’t running…&quot;