Android音频开发之MediaRecorder/MediaPlayer
前言:
上次我们介绍了实时采集音频数据以及播放,今天我们来认识一下直接录制文件的方式。
直接上代码:录制管理类
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的更多相关文章
- Android音频开发之AudioTrack实时播放
前言: 其实在Android中录音可以用MediaRecord录音,操作比较简单.但是不能对音频进行处理.考虑到项目中做的是实时语音只能选择AudioRecord进行录音.然后实时播放也只能采用Aud ...
- Android音频开发之AudioRecord录音实现
前言: 其实在Android中录音可以用MediaRecord录音,操作比较简单.但是不能对音频进行处理.考虑到项目中做的是实时语音只能选择AudioRecord进行录音. 本文算是对AudioRec ...
- Android底层开发之Linux输入子系统要不要推断系统休眠状态上报键值
Android底层开发之Linux输入子系统要不要推断系统休眠状态上报键值 题外话:一个问题研究到最后,那边记录文档的前半部分基本上都是没用的,甚至是错误的. 重点在最后,前边不过一些假想猜測. ht ...
- Android混合开发之WebViewJavascriptBridge实现JS与java安全交互
前言: 为了加快开发效率,目前公司一些功能使用H5开发,这里难免会用到Js与Java函数互相调用的问题,这个Android是提供了原生支持的,不过存在安全隐患,今天我们来学习一种安全方式来满足Js与j ...
- Android混合开发之WebView与Javascript交互
前言: 最近公司的App为了加快开发效率选择了一部分功能采用H5开发,从目前市面的大部分App来讲,大致分成Native App.Web App.Hybrid App三种方式,个人觉得目前以Hybri ...
- Android混合开发之WebView使用总结
前言: 今天修改项目中一个有关WebView使用的bug,激起了我总结WebView的动机,今天抽空做个总结. 混合开发相关博客: Android混合开发之WebView使用总结 Android混合开 ...
- Android安全开发之ZIP文件目录遍历
1.ZIP文件目录遍历简介 因为ZIP压缩包文件中允许存在“../”的字符串,攻击者可以利用多个“../”在解压时改变ZIP包中某个文件的存放位置,覆盖掉应用原有的文件.如果被覆盖掉的文件是动态链接s ...
- Android驱动开发之Hello实例
Android驱动开发之Hello实例: 驱动部分 modified: kernel/arch/arm/configs/msm8909-1gb_w100_hd720p-perf_defconf ...
- Android安全开发之WebView中的地雷
Android安全开发之WebView中的地雷 0X01 About WebView 在Android开发中,经常会使用WebView来实现WEB页面的展示,在Activiry中启动自己的浏览器,或者 ...
随机推荐
- [BZOJ4200][Noi2015]小园丁与老司机
4200: [Noi2015]小园丁与老司机 Time Limit: 20 Sec Memory Limit: 512 MBSec Special JudgeSubmit: 106 Solved ...
- browser-sync
引入 大家写网页的时候,肯定都遇到这种情况,每次用sublime写完都要返回浏览器,刷新页面,而这个工具正好解决了这个问题,提高前端开发效率,这是一个npm的包 browser-sync browse ...
- jmobile学习之路 ----检测屏幕宽度
<script type="text/javascript"> window.onresize = function(){ var myh1 = document.ge ...
- C#程序员开发WinForm必须知道的 Window 消息大全
不要以为下面的东西只有C++中才会用到哦! 消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了.例如,单击鼠标.改变窗口尺寸.按下键盘上的一个键都会使Windows发送一个消息给应用 ...
- cf 红名计划!
我要成为红名爷! 这是现在好弱好弱的窝 >_< ****************UPD ON 2015/12/10 0:20 啊啊啊啊啊啊啊啊啊啊啊啊把时间记错了啊QAQ 我也不知道为什么 ...
- placehoder不兼容ie9以下和opero12以下
颜色设置 解决方案一: ::-webkit-input-placeholder { /* WebKit browsers */ color:#999; } :-moz-placeholder { /* ...
- 定时任务crontab 例子
查看定时任务格式 [root@centos ~]# vim /etc/crontab 1 SHELL=/bin/bash 2 PATH=/sbin:/bin:/usr/sbin:/usr/bin 3 ...
- Android6.0动态获取权限
Android6.0采用新的权限模型,只有在需要权限的时候,才告知用户是否授权,是在runtime时候授权,而不是在原来安装的时候 ,同时默认情况下每次在运行时打开页面时候,需要先检查是否有所需要的权 ...
- 原生Ajax 和Jq Ajax
前言:这次介绍的是利用ajax与后台进行数据交换的小例子,所以demo必须通过服务器来打开.服务器环境非常好搭建,从网上下载wamp或xampp,一步步安装就ok,然后再把写好的页面放在服务器中指定的 ...
- 实例讲解 SQL 注入攻击
这是一篇讲解SQL注入的实例文章,一步一步跟着作者脚步探索如何注入成功,展现了一次完整的渗透流程,值得一读.翻译水平有限,见谅! 一位客户让我们针对只有他们企业员工和顾客能使用的企业内网进行渗透测试. ...