前言:

上次我们介绍了实时采集音频数据以及播放,今天我们来认识一下直接录制文件的方式。

直接上代码:录制管理类

public class MediaRecorderManager {
public static final String TAG = "Recorder";
private MediaRecorder mRecorder;
private static MediaRecorderManager mInstance; public MediaRecorderManager() { } /**
* 获取单例引用
*
* @return
*/
public static MediaRecorderManager getInstance() {
if (mInstance == null) {
synchronized (MediaRecorderManager.class) {
if (mInstance == null) {
mInstance = new MediaRecorderManager();
}
}
}
return mInstance;
} /**
* 开始录制
*
* @param filePath
*/
public void start(String filePath) {
try {
if(mRecorder==null) {
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//设置音频采集方式
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);//设置音频输出格式
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//设置音频编码方式
}
mRecorder.setOutputFile(filePath);//设置录音文件输出路径
mRecorder.prepare();
mRecorder.start();
} catch (Exception e) {
}
} /**
* 释放录音资源
*/
public void stop() {
try {
if (mRecorder != null) {
mRecorder.stop();
mRecorder.release();
}
} catch (IllegalStateException e) { } catch (RuntimeException e) { } catch (Exception e) { }
mRecorder = null;
} }

播放管理类:

public class MediaPlayerManager {
private static MediaPlayerManager mInstance;
private MediaPlayer player; /**
* 获取单例引用
*
* @return
*/
public static MediaPlayerManager getInstance() {
if (mInstance == null) {
synchronized (MediaPlayerManager.class) {
if (mInstance == null) {
mInstance = new MediaPlayerManager();
}
}
}
return mInstance;
} /**
* 播放录音
*
* @param url
* @return
*/
public boolean play(String url) {
return play(url, new OnCompletionListener() { @Override
public void onCompletion(MediaPlayer arg0) {
stop();
}
}, new OnErrorListener() { @Override
public boolean onError(MediaPlayer arg0, int arg1, int arg2) {
stop();
return false;
}
});
} /**
* 播放录音
* @param url
* @return
*/
public boolean play(String url, OnCompletionListener completionListener, OnErrorListener errorListener) {
stop();
if (TextUtils.isEmpty(url)) {
return false;
}
try {
if (player == null) {
player = new MediaPlayer();
player.setDataSource(url);
player.setVolume(0.7f, 0.7f);
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
player.prepare();
player.start();
player.setOnCompletionListener(completionListener);
player.setOnErrorListener(errorListener);
return true;
}
} catch (Exception e) {
stop();
}
return false;
} /**
* 释放资源
*/
public void stop() {
if (player != null) {
try {
player.stop();
player.release();
} catch (Exception e) {
e.printStackTrace();
} finally {
player = null;
}
}
} }

使用前要添加如下权限:

<!-- 录音权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

相关音频知识链接:

http://ticktick.blog.51cto.com/823160/1748506

Android音频开发之MediaRecorder/MediaPlayer的更多相关文章

  1. Android音频开发之AudioTrack实时播放

    前言: 其实在Android中录音可以用MediaRecord录音,操作比较简单.但是不能对音频进行处理.考虑到项目中做的是实时语音只能选择AudioRecord进行录音.然后实时播放也只能采用Aud ...

  2. Android音频开发之AudioRecord录音实现

    前言: 其实在Android中录音可以用MediaRecord录音,操作比较简单.但是不能对音频进行处理.考虑到项目中做的是实时语音只能选择AudioRecord进行录音. 本文算是对AudioRec ...

  3. Android底层开发之Linux输入子系统要不要推断系统休眠状态上报键值

    Android底层开发之Linux输入子系统要不要推断系统休眠状态上报键值 题外话:一个问题研究到最后,那边记录文档的前半部分基本上都是没用的,甚至是错误的. 重点在最后,前边不过一些假想猜測. ht ...

  4. Android混合开发之WebViewJavascriptBridge实现JS与java安全交互

    前言: 为了加快开发效率,目前公司一些功能使用H5开发,这里难免会用到Js与Java函数互相调用的问题,这个Android是提供了原生支持的,不过存在安全隐患,今天我们来学习一种安全方式来满足Js与j ...

  5. Android混合开发之WebView与Javascript交互

    前言: 最近公司的App为了加快开发效率选择了一部分功能采用H5开发,从目前市面的大部分App来讲,大致分成Native App.Web App.Hybrid App三种方式,个人觉得目前以Hybri ...

  6. Android混合开发之WebView使用总结

    前言: 今天修改项目中一个有关WebView使用的bug,激起了我总结WebView的动机,今天抽空做个总结. 混合开发相关博客: Android混合开发之WebView使用总结 Android混合开 ...

  7. Android安全开发之ZIP文件目录遍历

    1.ZIP文件目录遍历简介 因为ZIP压缩包文件中允许存在“../”的字符串,攻击者可以利用多个“../”在解压时改变ZIP包中某个文件的存放位置,覆盖掉应用原有的文件.如果被覆盖掉的文件是动态链接s ...

  8. Android驱动开发之Hello实例

    Android驱动开发之Hello实例:   驱动部分 modified:   kernel/arch/arm/configs/msm8909-1gb_w100_hd720p-perf_defconf ...

  9. Android安全开发之WebView中的地雷

    Android安全开发之WebView中的地雷 0X01 About WebView 在Android开发中,经常会使用WebView来实现WEB页面的展示,在Activiry中启动自己的浏览器,或者 ...

随机推荐

  1. [Android]依赖注入框架squareup的dagger

    分享一下Android依赖注入框架--Dagger使用 Dagger源码 Dagger1-Demo 希望能给大家的开发带来帮助.

  2. 第三周作业(一):安装VS以及创建单元测试

    安装的时候找的是最新版本的VS2015,因为不想花钱也不想用破解版,所以用社区版本. 下了一个IOS文件,社区版VS2015,个人免费版,强行表示不用盗版来表现自己高尚的情操:D 放入虚拟光驱软件后, ...

  3. Ubuntu install JDK适合像我的小白

    1.#下载JDK,记住保存的目录 2. sudo mkdir /usr/java 3. sudo tar zxvf jdk-7u75-linux-x64.tar.gz -C /usr/java 4. ...

  4. Python yield函数理解

    Python中的yield函数的作用就相当于一个挂起,是不被写入内存的,相当于一个挂起的状态,用的时候迭代,不用的时候就是一个挂起状态,挂起状态会以生成器的状态表现

  5. Java反编译代码对齐

    使用反编译的代码作为jar包源码进行调试时,经常会遇到的情况是反编译后的源码之在注释里包含行号,但是与代码所在行经常对应不上.这个时候,就有必要对代码进行对齐了. ​ public class Reo ...

  6. SMA、SMB、SMC封装的二极管

    以常见的贴片肖特基二极管SS14 SS24 SS34为例,三种管子区别主要在电流上,有三种封装:SMA.SMB.SMC. 从成本和体积来说,优先选用最小尺寸的SMA/DO-214AC封装,其他封装一般 ...

  7. if [ "$变量1"x = "$变量2"x ]中x的含义

    问题:if [ "$变量1"x = "$变量2"x ]中x的含义是? 答:“x”字符可以为任意字符,用于防止变量为空时,某些版本的bash中会产生错误: 在一个 ...

  8. (翻译)开始iOS 7中自动布局教程(二)

    这篇教程的前半部分被翻译出来很久了,我也是通过这个教程学会的IOS自动布局.但是后半部分(即本篇)一直未有翻译,正好最近跳坑翻译,就寻来这篇教程,进行翻译.前半部分已经转载至本博客,后半部分即本篇.学 ...

  9. Think in 递归

    网上写递归的文章可以用汗牛充栋来形容了,大多数都非常清晰而又细致的角度上讲解了递归的概念,原理等等.以前学生的时候,递归可以说一直是我的某种死穴,原理,细节我都懂,但是不管是在如何运用或者如何试试算法 ...

  10. "SQL Server does not handle comparison of NText, Text, Xml, or Image data types."

    "SQL Server does not handle comparison of NText, Text, Xml, or Image data types." sql2000 ...