«

Android开发使用MediaRecorder进行录音

时间:2024-3-2 21:25     作者:韩俊     分类: Android


在说手机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

热门推荐