Android开发教程 录音和播放

时间:2022-09-25 18:22:26

首先要了解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&period;0(4)基础篇---MapView

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

  3. ArcGIS Runtime for Android开发教程V2&period;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&period;0(2)开发环境配置

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

  5. ArcGIS Runtime for Android开发教程V2&period;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. C&num;通过NPOI操作Excel

    参考页面: http://www.yuanjiaocheng.net/webapi/create-crud-api-1-post.html http://www.yuanjiaocheng.net/w ...

  2. 聊聊asp&period;net中Web Api的使用

    扯淡 随着app应用的崛起,后端服务开发的也越来越多,除了很多优秀的nodejs框架之外,微软当然也会在这个方面提供更便捷的开发方式.这是微软一贯的作风,如果从开发的便捷性来说的话微软是当之无愧的老大 ...

  3. vue&period;js学习(第一课)

    学习资料 来自*小凡! vue.js是javascript的一个库,只专注于UI层面,核心价值永远是 API的简洁. 第一课: 不支持IE8. 1.声明式渲染: el元素的简称 element : ...

  4. 2014中国黑客榜&lpar;beta版&rpar;

    黑客,英文hacker.精通计算机各类技术的计算机高手,泛指擅长IT技术的人群.计算机科学家. 最近受某机构所托搜集国内活跃黑客近况.本着客观专业,权威可信的原则参考了国内从00年到最新的黑客榜单,以 ...

  5. SQLServer 删除所有表和删除所有存储过程

    1.删除所有表 use 数据库declare @tname varchar(8000)set @tname=''select @tname=@tname + Name + ',' from sysob ...

  6. jsoup 获取指定页面的所有链接(需后续完善)

    java代码如下: import java.io.IOException; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; impor ...

  7. flume-ng 使用spool source 传输文件到hdfs

    Flume 1.4.0 User Guide 地址:http://archive.cloudera.com/cdh4/cdh/4/flume-ng-1.4.0-cdh4.6.0/FlumeUserGu ...

  8. TCP 协议

    == 已经了解了以太网和IP了,下面我们进入传输层,开始讲解TCP协议. == 仍然先把TCP报文段的格式放在这里,然后我们看图说话: TCP报文段也分为首部和数据两部分,首部默认情况下一般是20字节 ...

  9. EF连接MySQL数据Web&period;Config配置

    EF连接MySQL数据Web.Config配置 <?xml version="1.0" encoding="utf-8"?> <configu ...

  10. 【一天一道LeetCode】&num;292&period; Nim Game

    一天一道LeetCode 从今天开始,调整规律,不按顺序做,从easy开始! 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 ...