前言:

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

直接上代码:录制管理类

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. 关于Web服务器的认识

    马上就要毕业了,也要开始找工作了,大学写了这么多代码了,却没有好好总结一下常用的概念很是遗憾额,就通过这篇博客记录一下我最常用的一些知识好了. 说到Web服务器,有很多文章都介绍的很好,之前看到一篇非 ...

  2. sparkR读取csv文件

    sparkR读取csv文件 The general method for creating SparkDataFrames from data sources is read.df. This met ...

  3. JavaScript固定宽高

    固定高宽:  <script type="text/javascript">         if (/Android (\d+\.\d+)/.test(navigat ...

  4. [ios] 定位报错Error Domain=kCLErrorDomain Code=0 "The operation couldn’t be completed. (kCLErrorDomain error 0.)"

    Error Domain=kCLErrorDomain Code=0 "The operation couldn’t be completed. (kCLErrorDomain error ...

  5. iOS Block理解

    以前看到Block觉得也没什么,不就是类似函数的东西,这东西在C#里就是委托,在Java里就是块,有什么稀奇的.但看到一点进阶的内容后,发现这个东西确实有用. 所以做下总结. 一.块的基本用法 块的语 ...

  6. pythonchallenge 解谜 Level 2

    好吧,赶紧贴一下. #-*- coding:utf-8 -*- #代码版本均为python 3.5.1 #Level 2 import re file = open("Level 2.txt ...

  7. 原生JS制作贪吃蛇小游戏

    感情都在代码里,来,干了!... <!doctype html> <html> <head> <meta http-equiv="Content-T ...

  8. Lua源代码阅读分析问题列表(转)

    最近正在阅读lua源码,遇到座灯塔,转载如下: 我个人的习惯是带着问题去研究一个新题目,比如这次阅读Lua代码,暂列下面这些问题. 1)什么是基于栈.基于寄存器的虚拟机(VM)设计?Lua如何实现基于 ...

  9. php面向对象中的几个基本定义

    面向对象: 面向对象是现代编程中的一种重要设计方法,其基本思想是使用对象,类,封装,继承等来进行程序设计. 对象: 一只猪,一只羊,一辆汽车. 类: 类的主要作用就是创建对象. 封装: 类的特点是将对 ...

  10. Java学习笔记1

    学习一个Coursera的Data-structures-optimizing-performance. Working with String in Java Flesh score Flesh s ...