前言:

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

直接上代码:录制管理类

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. Xml 建议优先使用属性

    要点:建议优先选用属性的方式记录数据,除非还需要包容层级式的数据. 优点: 1. 可以完全覆盖关系型数据库的数据格式设计,利于交换. 2. 占用空间小.相当于 JSON 格式,不再有大量重复的节点名后 ...

  2. weex append

    append有两个值:其中的一个是tree, 另外一个是node. 不会像数据绑定一样对最后的渲染结果有影响.但它决定是否会影响整个节点的重绘还是只是某一个地方的内容会重绘. append=" ...

  3. Django 中related_name,"%(app_label)s_%(class)s_related"

    先看个model from django.db import models # Create your models here. class Parent(models.Model): name = ...

  4. linux下QT程序输出乱码解决方法

    参考文章:http://blog.csdn.net/jiang1013nan/article/details/6667871 http://my.oschina.net/zjlaobusi/blog/ ...

  5. html5地理位置定位功能小析

    Geolocationd 基本原理1.GPS    GPS基本原理是测量出已知位置的卫星到用户接收机之间的距离,然后综合多颗卫星的数据就可知道接收机的具体位置.适用于具备GPS功能的设备(1)优点:在 ...

  6. cf 红名计划!

    我要成为红名爷! 这是现在好弱好弱的窝 >_< ****************UPD ON 2015/12/10 0:20 啊啊啊啊啊啊啊啊啊啊啊啊把时间记错了啊QAQ 我也不知道为什么 ...

  7. 第一个独立开发的游戏 怪斯特:零 已经上线APP STORE!

    今天是个值得纪念的日子,而且是双喜临门 2年多来的摸爬滚打,终于有了回报 第一喜:自己独立开发的游戏 怪斯特:零 已经通过审核并上架APP STORE! 第二喜:迈入了自己期待2年之久的游戏行业,年后 ...

  8. css简单评论页面

    <!DOCTYPE html> <html> <head> <meta charset='utf-8'> <style> *{margin: ...

  9. Javascript初学篇章_6(BOM)

    BOM 浏览器对象模型 BOM (浏览器对象模型),它提供了与浏览器窗口进行交互的对象 一.window对象 Window对 象表示整个浏览器窗口. 1.系统消息框 alert() alert('he ...

  10. Hbuilder开发HTML5 APP之侧滑菜单

    1.思路: 其时有2个WebView,一个main是用来装主页面,一个menu是用来装菜单(为提高性能,菜单项是采用了预加载方式的,预加载时为了避免和主页面争夺资源,采用延时加载,例如: //plus ...