在说手机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对象的相应停止录音的方法。
播放录音文件也可以同开始录音停止录音那样使用。