收藏本站 收藏本站
积木网首页 - 技术学院 - 软件测试 - 网站黄页 - 常用手册 - 站长工具 - 技术社区
首页 > Android > Android技巧 > 正文

首页 - PHP - 数据库 - 操作系统 - 游戏开发 - JS - Android - MySql - Redis - MongoDB - Win8 - Shell编程 - DOS命令 - jQuery - CSS样式 - Python - Perl

Access - Oracle - DB2 - SQLServer - MsSql2008 - MsSql2005 - Sqlite - PostgreSQL - node.js - extjs - JavaScript vbs - Powershell - Ruby

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

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


版权声明:本文为博主原创文章,未经博主允许不得转载。

android开发之GestureDetector手势识别(调节音量、亮度、快进和后退)
写UI布局:?xmlversion="1.0"encoding="utf-8"?LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:fit

《深入理解Android网络编程》第3章
http://www.apkbus.com/android-140261-1-1.html请求GET请求获取Request-URI所标识的资源POST在Request-URI所标识的资源后附加新的数据GET方式提交的数据最多只能有2048字

ListView滑动删除 ,仿腾讯QQ
转载请表明出处:http://blog.csdn.net/lmj623565791/article/details/22961279在CSDN上开了很多大神们的文章,感觉受益良多,也非常欣赏大家的分享态度,所以决定开

本周排行

更新排行

强悍的草根IT技术社区,这里应该有您想要的! 友情链接:b2b电子商务
Copyright © 2010 Gimoo.Net. All Rights Rreserved  京ICP备05050695号