前言:

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

直接上代码:录制管理类

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. [field:picname/]和[field:litpic/]区别

    显示出二级栏目及以下的所有图片(包含三级栏目的) <ul class="incps"> {dede:arclist row=9 col="3" ty ...

  2. 媒体查询(pc端,移动端不同布局)

    媒体查询语法: 1.内联写法:and之后必须有空格@media screen and (min-width:960px //判断浏览器大小条件){body{background:red} //常规的样 ...

  3. JS键盘KEYCODE值参考

    keycode 1 = 鼠标左键keycode 2 = 鼠标右键keycode 3 = Cancelkeycode 4 = 鼠标中键keycode 8 = BackSpace keycode 9 = ...

  4. Struct2 csv文件上传读取中文内容乱码

    网络上搜索下,发现都不适合 最终改写代码: FileInputStream fis = null; InputStreamReader isr = null; BufferedReader br= n ...

  5. 浏览器访问Servlet

    浏览器访问Servlet1.指定一个Servlet路径(                     在web.xml :              <servlet>             ...

  6. Xamarin.Forms 免费电子书

    Xamarin Evolve 正在举行,现在已经放出2本免费的Xamarin.Forms 免费电子书,据现场的同学说这两天还有Xamarin.Forms 重磅消息发布: Creating Mobile ...

  7. 关于MongoDB你需要知道的几件事

    Henrique Lobo Weissmann是一位来自于巴西的软件开发者,他是itexto公司的联合创始人,这是一家咨询公司.近日,Henrique在博客上撰文谈到了关于MongoDB的一些内容,其 ...

  8. Kotlin笔记

    官网: http://kotlinlang.org/ http://kotlinlang.org/docs/reference/ 中文教程: http://kotlindoc.com/ Gradle: ...

  9. ABP理论学习之缓存Caching

    返回总目录 本篇目录 介绍 ICacheManager ICache ITypedCache 配置 介绍 ABP提供了缓存的抽象,它内部使用了这个缓存抽象.虽然默认的实现使用了MemoryCache, ...

  10. python实现grep

    import sys import os import re def usage(): print "[Usage]: python grep.py filename grepString. ...