在说手机android开发如何使用MediaRecorder进行录音前,我先来说一下如何在手机SD卡或手机内存上定义路径吧(优先存储在SD卡上)。
// 获取存放图片或录音文件的路径(手机内存上或内存卡上)
private String getPath() {
String sdStatus = Environment.getExternalStorageState();
String path;
if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { // 检测sd是否可用
path = WriteDiary.this.getFilesDir().toString() + "/Test/";
} else {
path = Environment.getExternalStorageDirectory().toString() + "/Test/";
}
File file = new File(path);
if (!file.exists()) {
file.mkdirs(); // 创建文件夹
}
return path;
}
我们可以先使用该方法获取我们将要存储录音文件的位置。
这里我自己写了一个录音类(其中还包含播放录音文件的方法,需要时可以进行调用)
import java.io.File;
import java.io.IOException;
import java.util.Calendar;
import java.util.Locale;
import android.content.Context;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.net.Uri;
import android.text.format.DateFormat;
//作为工具类存在:手机应用使用手机录音时调用
public class RecordSound {
private String pn;// 路径加名称
// 系统的音频文件
private File soundFile;
private MediaRecorder mRecorder;
private MediaPlayer mPlayer;// 用于播放录音文件
private Context context;
// 调用该方法将可进行录音操作
// 输入手机中存放录音的位置即可进行调用,音频文件将以时间作为名字进行保存
public void startRecord(String path) {
try {
pn = path
+ DateFormat.format("yyyyMMdd_hhmmss",
Calendar.getInstance(Locale.CHINA)) + ".amr";
// 创建保存录音的音频文件
soundFile = new File(pn);
mRecorder = new MediaRecorder();
// 设置录音的声音来源
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
// 设置录制的声音的输出格式(必须在设置声音编码格式之前设置)
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
// 设置声音编码的格式
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setOutputFile(soundFile.getAbsolutePath());
mRecorder.prepare();
mRecorder.start(); // 开始录音
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 停止录音,释放资源
public void stopRecord(Context cn) {
if (soundFile != null && soundFile.exists()) {
context = cn;
// 停止录音
mRecorder.stop();
// 释放资源
mRecorder.release();
mRecorder = null;
mPlayer = MediaPlayer.create(context,
Uri.fromFile(new File(pn)));
}
}
// 播放录音文件
public void playRecordSource() {
// 播放
mPlayer.start();
}
// 停止播放录音文件
public void pauseRecordSource() {
if (mPlayer.isPlaying()) {
mPlayer.pause();
mPlayer.seekTo(0);
}
}
//这里存在:BUG
/*
* java.lang.RuntimeException: Unable to destroy activity
* {com.diary.view/com.diary.view.extra.WriteDiary}:
* java.lang.IllegalStateException
* 情况:为了在活动停止后,也使得正在播放的录音文件停止,需要调用stop方法,否则录音文件将持续播放,为了解决该问题,增加stop和release方法。
* 原因:可是在活动停止前,如果录音文件并没有在播放的话(或者说处于其他状态的话)就可能出现问题 了。
* 在这里将直接调用release方法,又可以达到目的,又可以解决问题了。
* 解决:进行如下注释。
*/
public void stopRecordSource() {
if(mPlayer != null) {
/*if(mPlayer.isPlaying())
mPlayer.stop();*/
mPlayer.release();
}
}
public String getPathName() {
return pn;
}
}
出现上述代码中所说的BUG(已解决+原因在代码中):
这里介绍一下RecordSound的使用说明:
我们可以假定:现在Android布局文件中有一个Button,而这个Button中注册了监听器,监听器外可以创建一个 RecordSound对象,当Button被点击时,RecordSound对象可以调用startRecord方法开始进行录音,该方法要传入路径,使用我刚写的获取路径的方法即可。为了体现录音效果我们可以在布局文件中增加一个计时器(这里还定义了stop按钮):
<RelativeLayout
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:background="@android:color/white" >
<Chronometer
android:id="@+id/chronometer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:format="%s"
android:textColor="#00BB9C"
android:textSize="50px" />
<Button
android:id="@+id/stop_record_bt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/chronometer"
android:layout_centerHorizontal="true"
android:background="@null"
android:text="@string/stop_record"
android:textColor="@drawable/cancel_button_selector" />
</RelativeLayout>
当录音结束后可以点击stop_record_bt按钮,停止录音。当然该按钮注册了相应的监听器,调用了RecordSound对象的相应停止录音的方法。
播放录音文件也可以同开始录音停止录音那样使用。