Android开发使用MediaRecorder进行录音

在说手机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对象的相应停止录音的方法。

播放录音文件也可以同开始录音停止录音那样使用。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值